0

ListView绑定到一个视图模型,其中包含ObservableCollection一个简单的示例应用程序。

public class ViewModel : INotifyPropertyChanged
{
    public ViewModel(){}

    public event PropertyChangedEventHandler PropertyChanged;

    public ObservableCollection<Item> _items;
    public ObservableCollection<Item> Items 
    {
        get 
        { 
            return this._items; 
        }
        set
        {
            if (value != this._items)
            {
                this._items = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("Items"));
            }
        }         
    }
}
public class Item
{
    public string Name;
}

以下函数绑定到 ListView 的 SelectionChanged 事件

private void ItemListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    model.Items.Add(new Item { Name = "added item" });
    model.Items = new ObservableCollection<Item> { new Item { Name = "new item 1" }};
}

当事件触发时,这应该发生

  1. 附加到现有的新项目(“添加的项目”)ObservableCollection
  2. ObservableCollection设置为新集合 [单个项目,“新项目 1”]

实际发生的情况:

  1. ObservableCollection设置为新集合 [单个项目,“新项目 1”]
  2. 新项目(“添加的项目”)附加到集合的末尾

谁能解释为什么这些以错误的顺序发生?

4

2 回答 2

2

谁能解释为什么这些以错误的顺序发生?

我的猜测是它们没有以错误的(反向)顺序发生,但追加发生了两次。执行

 model.Items = ... ;

在那些相同项目的 SelectionChanged 中非常大胆。它将再次触发 SelectionChanged,并且仅因为 Selection 然后保持为无(索引 -1),您不会进入无限循环。

于 2012-09-24T15:30:15.723 回答
0

可观察的集合不需要 inotify,试试这个:

public class ViewModel : INotifyPropertyChanged
{
    public ViewModel(){}



    public ObservableCollection<Item> Items ;

}
于 2012-09-24T15:34:00.013 回答