2009-05-13 12 views
5

Ten doprowadza mnie do szału. Oto XAML:Wiązanie ComboBox.SelectedItem w Silverlight

<UserControl x:Class="SilverlightApplication1.Page" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid x:Name="LayoutRoot" Background="White"> 
    <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top"> 
     <ComboBox ItemsSource="{Binding Path=Thing.Stuff}" 
       SelectedItem="{Binding Path=Thing.SelectedStuff}"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
      <TextBlock Text="{Binding Path=Name}" /> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
     </ComboBox> 
     <Button Content="Again" Click="Button_Click" /> 
    </StackPanel> 
    </Grid> 
</UserControl> 

A codebehind:

using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Linq; 
using System.Windows; 
using System.Windows.Controls; 

namespace SilverlightApplication1 
{ 
    public partial class Page : UserControl 
    { 
     public Page() 
     { 
      InitializeComponent(); 

      Data data = new Data(); 
      data.Thing = new Thing(); 
      data.Thing.Stuff = new ObservableCollection<Stuff>(); 
      data.Thing.Stuff.Add(new Stuff { Name = "Stuff 1" }); 
      data.Thing.Stuff.Add(new Stuff { Name = "Stuff 2" }); 
      data.Thing.Stuff.Add(new Stuff { Name = "Stuff 3" }); 
      data.Thing.SelectedStuff = data.Thing.Stuff.Last(); 
      DataContext = data; 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      Data data = (DataContext as Data); 
      data.Thing.Stuff.Clear(); 
      data.Thing.Stuff.Add(new Stuff { Name = "Stuff 4" }); 
      data.Thing.Stuff.Add(new Stuff { Name = "Stuff 5" }); 
      data.Thing.Stuff.Add(new Stuff { Name = "Stuff 6" }); 
      data.Thing.SelectedStuff = data.Thing.Stuff.Last(); 
     } 
    } 

    public class Data : INotifyPropertyChanged 
    { 
     private Thing _Thing; 

     public Thing Thing 
     { 
      get { return _Thing; } 
      set { _Thing = value; NotifyPropertyChanged("Thing"); } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected void NotifyPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged == null) { return; } 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public class Thing : INotifyPropertyChanged 
    { 
     private ObservableCollection<Stuff> _Stuff; 

     public ObservableCollection<Stuff> Stuff 
     { 
      get { return _Stuff; } 
      set { _Stuff = value; NotifyPropertyChanged("Stuff"); } 
     } 

     private Stuff _SelectedStuff; 

     public Stuff SelectedStuff 
     { 
      get { return _SelectedStuff; } 
      set { _SelectedStuff = value; NotifyPropertyChanged("SelectedStuff"); } 
     } 


     public event PropertyChangedEventHandler PropertyChanged; 

     protected void NotifyPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged == null) { return; } 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public class Stuff : INotifyPropertyChanged 
    { 

     private string _Name; 

     public string Name 
     { 
      get { return _Name; } 
      set { _Name = value; NotifyPropertyChanged("Name"); } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected void NotifyPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged == null) { return; } 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Po załadowaniu strony, istnieje ComboBox z "Rzeczy 3" wybrany. Po kliknięciu przycisku pozycje w oknie ComboBox zmieniają się, ale należy wybrać "Rzeczy 6". Zamiast tego nic nie jest wybrane.

+0

Jeśli cię to pocieszy, to działa na mnie w WPF (Zobaczę o Silverlight). – Ray

Odpowiedz

13

Spróbuj tego:

<ComboBox ItemsSource="{Binding Path=Thing.Stuff}"     
     SelectedItem="{Binding Path=Thing.SelectedStuff, Mode=TwoWay}"> 

SelectedItem nie lubi być związana jednokierunkowy. Nie miałem okazji wypróbować tego w Silverlight 2, ale w Silverlight 3 otrzymasz nawet żółty trójkąt śmierci, jeśli nie użyjesz wiązania TwoWay.

+0

Wystarczy sprawdzeniu, że to rozwiązuje go w SL2 Nice spotting – Ray

+0

To naprawia to w tym przykładzie, ale nie w moim większym projekcie Nie jestem pewien, co się tam dzieje –

+0

Hmmm, jeśli możesz podać więcej szczegółów na temat tego, co różni się w twoim większym projekcie od przykładu, który został tutaj podany wtedy możemy być w stanie lepiej zdiagnozować problem – markti

0

Oczywiście wiązanie musi być TwoWay. Ale ustawienie ItemsSource na formantu nie oznacza, że ​​DataContext (gdzie powinna wskazywać zmienna SelectedItem) jest ustawiony. Upewnij się, że DataContext zestawu kombi jest dobrze ustawiony. (W moim przypadku do strony. Jako selectedStuff jest właściwością Page.

cmbStuff.DataContext = Me '(from Page.Load)