c#代码以错误的顺序执行 - 奇怪的行为

时间:2012-09-24 15:25:43

标签: c# wpf events windows-runtime

我有一个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”]
  3. 实际发生的事情:

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

      任何人都可以解释为什么这些发生在错误的顺序?

2 个答案:

答案 0 :(得分:2)

  

任何人都可以解释为什么这些发生在错误的顺序?

我的猜测是他们没有发生错误(逆转)的顺序,但追加发生了两次。执行

 model.Items = ... ;

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

答案 1 :(得分:0)

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

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



    public ObservableCollection<Item> Items ;

}