2009-05-13 16 views
5

Este me está volviendo loco. Aquí está el XAML:Encuadernación ComboBox.SelectedItem en 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> 

Y el código subyacente:

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

Cuando se carga la página, hay un cuadro combinado con la "Quema! 3" seleccionado. Cuando se hace clic en el botón, los elementos en el ComboBox cambian, pero debe seleccionarse "Stuff 6". En cambio, no se selecciona nada.

+0

Si te sirve de consuelo, a mí me funciona en WPF (Voy a ver acerca de Silverlight). – Ray

Respuesta

13

Prueba esto:

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

SelectedItem no le gusta estar obligado OneWay. No he tenido la oportunidad de probarlo en Silverlight 2, pero en Silverlight 3 incluso obtendrás el triángulo amarillo de la muerte si no usas el enlace TwoWay.

+0

Sólo comprobado que este lo fija en SL2 Buena detección – Ray

+0

Eso lo arregla en este ejemplo, pero no en mi proyecto más grande. No estoy seguro de lo que está pasando allí. –

+0

Hmmm, si puede proporcionar más detalles sobre qué es diferente en su proyecto más grande contra el ejemplo que se proporcionó aquí entonces podríamos ser capaces de diagnosticar mejor el problema. – markti

0

Por supuesto, el enlace debe ser de dos vías. Pero establecer un ItemsSource en un control no significa que el DataContext (donde debe apuntar la variable SelectedItem) esté configurado. Asegúrese de que el DataContext del combo esté bien configurado. (En mi caso, a la página. Como selectedStuff es una propiedad de página.

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