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

これらが間違った順序で起こっている理由を誰か説明できますか?

私の推測では、それらは間違った (逆の) 順序で発生していませんが、追加は 2 回発生しています。実行中

 model.Items = ... ;

それらの同じ項目の SelectionChanged ではかなり大胆です。それは再び SelectionChanged をトリガーしますが、Selection が none (Index -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 に答える