2012-09-24 67 views
0

我有一个ListView绑定到一个视图模型,其中包含ObservableCollection在一个简单的示例应用程序。c#代码以错误的顺序执行 - 奇怪的行为

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

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

当事件触发的SelectionChanged事件,这应该发生

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

什么实际情况:

  1. ObservableCollection组附加到结束收集
  2. 的新集合[单个项目, “新项目1”]
  3. 新项目( “添加项”)

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

+0

如果您使用的ObservableCollection,你为什么要创建集合的新实例每次?你不能只用现有的一个吗? –

+0

_items应该是私人的,它是新的。如果你想要一个清新的收藏清除它并不新。并且在SelectionChanged中更改集合是很滑的。 +1 Henk – Paparazzi

回答

2

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

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

model.Items = ... ; 

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

+0

ahhhhhhhhhhhhhhh – roryok

0

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

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



    public ObservableCollection<Item> Items ; 

} 
+0

应该是:public ObservableCollection Items {get;私人设置;}并在构造函数初始化它。 – JoanComasFdz