2009-05-13 5 views
5

Questo mi sta facendo impazzire. Ecco il codice XAML:Binding ComboBox.SelectedItem in 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> 

E 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)); 
     } 
    } 
} 

Al caricamento della pagina, c'è una casella combinata con "Roba 3" selezionato. Quando si fa clic sul pulsante, gli elementi nel ComboBox cambiano, ma "Stuff 6" deve essere selezionato. Invece, nulla è selezionato.

+0

Se può essere di consolazione, per me funziona in WPF (Vedrò su Silverlight). – Ray

risposta

13

Prova questa:

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

SelectedItem non piace essere vincolati OneWay. Non ho avuto la possibilità di provarlo in Silverlight 2, ma in Silverlight 3 otterrai anche il triangolo giallo della morte se non usi il binding TwoWay.

+0

Proprio verificato che questo risolve in SL2 Bel spotting – Ray

+0

Questo lo risolve in questo esempio, ma non nel mio progetto più grande Non so cosa sta succedendo lì. –

+0

Hmmm, se puoi fornire maggiori dettagli su cosa è diverso nel tuo progetto più grande rispetto all'esempio che è stato fornito qui quindi potremmo essere in grado di diagnosticare meglio il problema. – markti

0

Naturalmente il binding deve essere TwoWay. Ma l'impostazione di un oggetto ItemsSource su un controllo non significa che il DataContext (dove la variabile SelectedItem deve puntare a) è impostato. Assicurati che DataContext della combo sia ben impostato. (Nel mio caso, a pagina. Come selectedStuff è una proprietà di pagina.

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