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.
Si te sirve de consuelo, a mí me funciona en WPF (Voy a ver acerca de Silverlight). – Ray