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.
Se può essere di consolazione, per me funziona in WPF (Vedrò su Silverlight). – Ray