0

ObservableCollectionclass: を含むものがありますMyClass

    private ObservableCollection<MyClass> _myCollection;

    public ObservableCollection<MyClass> MyCollection
    {
        get { return _myCollection; }
        set
        {
            _myCollection= value;
        }
    }

C#コレクションが変更された場合、コードで知りたいです。

コレクションのイベントに登録したのでCollectionChanged、レコードの追加/削除時に動作します。

ここに登録されています:

   MyCollection.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(MyCollection_CollectionChanged);

クラス内で何かが変更されたときに、このイベントを機能させたい (または別のイベントを登録したい)。

最初PropertyChangedは、クラスのイベントに登録してから、それを介してイベントを実行することを考えましCollectionChangedた。これは複雑で不要に思えます。

bindingofwpfはクラスの変更とコレクション自体の変更を認識できるため、コードでこれを行うことができると思います。

私が間違っている?(より正確な質問は: 誰もこれへの方法を知っていますか?)

4

2 に答える 2

4

Nik が既に述べたように、PropertyChanged イベントは正しい方法です。ただし、 CollectionChanged イベントを手動で呼び出したり、そのように「強制」したりしないでください。次のように、イベント内でコードをリファクタリングする必要があります。

public class MyClass : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value; OnPropertyChanged("Name"); }
    }

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class Class1
{
    private ObservableCollection<MyClass> _myCollection = new ObservableCollection<MyClass>();
    public ObservableCollection<MyClass> MyCollection
    {
        get { return _myCollection; }
        // set { _myCollection = value; } // see Clemens' comment
    }

    public Class1()
    {
        // hook up this event at the appropriate place, does not have to be the ctor
        MyCollection.CollectionChanged += MyCollection_CollectionChanged;

        MyClass m = new MyClass() { Name = "Example" };

        MyCollection.Add(m); // calls ExecuteOnAnyChangeOfCollection
        m.Name = "ChangedValue"; // calls ExecuteOnAnyChangeOfCollection
    }

    void MyCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (MyClass item in e.NewItems)
                item.PropertyChanged += MyClass_PropertyChanged;
        }

        if (e.OldItems != null)
        {
            foreach (MyClass item in e.OldItems)
                item.PropertyChanged -= MyClass_PropertyChanged;
        }

        ExecuteOnAnyChangeOfCollection();
    }

    void MyClass_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        ExecuteOnAnyChangeOfCollection();
    }

    private void ExecuteOnAnyChangeOfCollection()
    {
        // handling code ...
        System.Windows.MessageBox.Show("Collection has changed.");
    }
于 2013-03-10T15:33:00.080 に答える
2

あなたが正しいです。MyClass から通知を取得する最も簡単な方法は、PropertyChanged イベントをサブスクライブすることです (MyClass が INotifyPropertyChanged を実装している場合)。

UI を更新するには、変更された項目を削除してから追加するか (これにより CollectionChanged が自動的に発生します)、または Reset パラメータを使用して CollectionChanged イベントを手動で呼び出します (これを行うには ObservableCollection クラスを拡張する必要がありますが、これはかなり簡単な作業です)。

于 2013-03-10T14:11:43.907 に答える