0

今天我再次陷入了非常基本的概念。我在做什么错误。

我有 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);

该值始终为假。但是为什么,为什么我从集合中获得对同一对象的新引用。

如何解决这个问题。

谢谢

4

2 回答 2

2

您将获得一个新的参考,因为每次绑定机制都会要求 MyItems 您将创建一个新列表。尝试创建一次并使用可观察的集合

于 2013-04-08T06:50:57.377 回答
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}
    }
}
于 2013-04-08T07:29:42.273 回答