пятница, 18 марта 2011 г.

Различие SelectedValue и SelectedItem

В WPF у всех наследниках Selector, вроде ComboBox или LixtBox есть поля SelectedValue и SelectedItem, которые часто принимают за идентичные, однако это не совсем так. SelectedItem - это выбранный объект в том виде какой он находится в коллекции. SelectedValue - это объект полученный из SelectedItem по пути указанному в поле SelectedValuePath. Простой пример:
Возмем следующий класс:
 class Number  
 {  
      public int N { get; set; }  
      public String Name { get; set; }  
      public override string ToString()
      {
           return String.Format("{0} is {1}", N, Name);
      }
      public Number(int n, String name)  
      {  
           N = n;  
           Name = name;  
      }  
 }  
Создадим окно, в качестве DataContext подсунем коллекцию из экземплярв класса Number. Конструктор окна получился такой
 public MainWindow()  
 {  
      InitializeComponent();  
      DataContext = new Number[]{new Number(1, @"one"),  
                                 new Number(2, @"two"),   
                                 new Number(3, @"three"),   
                                 new Number(4, @"four"),   
                                 new Number(5, @"five")};  
 }  
А вот сама разметка, для интереса добавил отображение полей SelectedValue и SelectedItem.
 <StackPanel>  
      <ListBox ItemsSource="{Binding}" SelectedValuePath="N" x:Name="list" Padding="2"/>  
      <StackPanel Margin="3" Orientation="Horizontal">  
           <Label Content="SelectedValue"/>  
           <TextBox Text="{Binding SelectedValue, UpdateSourceTrigger=PropertyChanged, ElementName=list}"/>  
      </StackPanel>  
      <StackPanel Margin="3" Orientation="Horizontal">  
           <Label Content=" SelectedItem"/>  
           <Label Content="{Binding SelectedItem, ElementName=list}"/>  
      </StackPanel>  
 </StackPanel>  
Окошко выглядит так
1 SelectedItem возвращает выбранный объект(типа Number), а SelectedValue возвращает значение SelectedValue.N (типа int). Кроме того, каждый объект в ListBox ассоциируется со значением своего поля N. Задав значение SelectedValue будет выбран объект у которого свойство N равно SelectedValue, если таких объектов окажется несколько, в качестве SelectedItem будет установлен первый по порядку. Исходники здесь.

Комментариев нет:

Отправить комментарий