简体   繁体   English

组合框所选项目问题

[英]Combobox selected item issue

Today I am stucked in very basic concept again. 今天,我再次陷入了非常基本的概念。 What is the mistake I am doing. 我在做什么错。

I have XAML like 我有像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"/>

My ModelView looks like 我的ModelView看起来像

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));
        }
    }
}

One MyItems property and one SelectedItem property 一个MyItems属性和一个SelectedItem属性

and Click handler like 和点击处理程序,例如

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

I found that TextBlock.Text is updating but Combobox selected item is not updating. 我发现TextBlock.Text正在更新,但Combobox所选项目未更新。 I try to dig out the reason and found that if I execute code below 我尝试找出原因,发现如果我执行以下代码

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

The value is always false. 该值始终为false。 But why, why I am getting the new reference to same object from collection. 但是为什么,为什么我要从集合中获得对同一对象的新引用。

How can resolve this issue. 如何解决这个问题。

Thanks 谢谢

you are getting a new reference because each time the binding mechanism will ask for MyItems you will create a new list. 您将获得一个新的引用,因为每次绑定机制询问MyItems时,您都会创建一个新列表。 try creating it once and use observable collection 尝试一次创建它并使用可观察的集合

You need to modify your MyItems code. 您需要修改MyItems代码。 You are getting new list every time. 您每次都在获取新列表。 Try this out. 试试看

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}
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM