2013-04-08 60 views
0

今天我再次陷入非常基本的概念。我在做什麼錯誤。Combobox選擇的商品問題

我有喜歡的XAML

<ComboBox ItemsSource="{Binding MyItems}" Height="40" Width="200" SelectedIndex="0" 
       SelectedItem="{Binding MySelectedItem}"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}"/> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 
    <TextBlock Text="{Binding MySelectedItem.Name}"/> 
    <Button Content="Test" Grid.Row="1" Click="Button_Click_1"/> 

我的模型視圖看起來像

public class MainViewModel : DependencyObject,INotifyPropertyChanged 
{ 
    private MyModel mySelectedItem; 
    public MyModel MySelectedItem 
    { 
     get 
     { 
      return mySelectedItem; 
     } 
     set 
     { 
      if (value != mySelectedItem) 
      { 
       mySelectedItem = value; 
       RaisePropertyChange("MySelectedItem"); 
      } 
     } 
    } 
    public IList<MyModel> MyItems 
    { 
     get 
     { 
      return new List<MyModel>() {new MyModel(){Name="A"}, 
             new MyModel(){Name="B"}, 
             new MyModel(){Name="C"}}; 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChange(string name) 
    { 
     if(PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 

一個MyItems財產和一個SelectedItem屬性

和點擊處理程序一樣

private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     Random r = new Random(); 
     int icnt = r.Next(0,3); 
     model.MySelectedItem = model.MyItems[icnt]; 
    } 

我發現TextBlock.Text正在更新,但Combobox選擇的項目沒有更新。我試圖挖掘原因,發現如果我執行下面的代碼

MyModel prevItem = model.MyItems.Where((m) => m.Name.Equals("A")).FirstOrDefault(); 
     MyModel newItem = model.MyItems.Where((m) => m.Name.Equals("A")).FirstOrDefault(); 
     bool result = prevItem.Equals(newItem); 

該值始終爲false。但爲什麼,爲什麼我從集合中獲得對同一對象的新引用。

如何解決此問題。

感謝

+2

每次綁定機制都會詢問MyItems您將創建一個新列表。嘗試創建一次,並使用可觀察的集合 – makc 2013-04-08 06:46:43

+0

哦曼..我浪費了這麼多時間在這..這樣一個小問題,它是..非常感謝。你可以添加它在答案.. – 2013-04-08 06:50:02

回答

2

你得到一個新的參考,因爲每一次的綁定機制會要求MyItems您將創建一個新的列表。 嘗試創建一次並使用可觀察集合

1

您需要修改您的MyItems代碼。你每次都會得到新的列表。嘗試一下。

private List<MyModel> _myItems; 
public IList<MyModel> MyItems 
{ 
    get 
    { 
     if (_myItems == null) 
     { 
      myItems = new List<MyModel>(); 
      myItems.Add(new MyModel() { Name = "A" }); 
      myItems.Add(new MyModel() { Name = "B" }); 
      myItems.Add(new MyModel() { Name = "C" }); 
     } 
     return _myItems} 
    } 
}