Binding ComboBox.SelectedItem in Silverlight
29,885
Try this:
<ComboBox ItemsSource="{Binding Path=Thing.Stuff}"
SelectedItem="{Binding Path=Thing.SelectedStuff, Mode=TwoWay}">
SelectedItem does not like to be bound OneWay. I haven't had a chance to try it out in Silverlight 2 but in Silverlight 3 you will even get the yellow triangle of death if you don't use TwoWay binding.
Author by
Josh Santangelo
Updated on July 09, 2022Comments
-
Josh Santangelo almost 2 years
This one is driving me crazy. Here's the XAML:
<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>
And the 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 ) ); } } }
When the page loads, there is a ComboBox with "Stuff 3" selected. When the button is clicked, the items in the ComboBox change, but "Stuff 6" should be selected. Instead, nothing is selected.