处理分配事件

时间:2014-03-05 08:51:43

标签: c# wpf binding assignment-operator

我有一组定义如下的数据(MyData被定义为一个类):

ObservableCollection<MyData> data = new ObservableCollection<MyData>();

每当其数据改变时,我将其与另一个名为another_func()的函数绑定:

data.CollectionChanged += data_CollectionChanged;
...
void data_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    another_func();
}

如果我只是添加或删除data中的元素,它会很有效,即只要这些操作发生,它就会自动调用another_func()

但是,当我尝试将值分配给another_func()时,它无效(不会触发data),例如:

data = another_data; // another_data also with type ObservableCollection<MyData>

为什么不能处理赋值事件?以及如何使其发挥作用?

1 个答案:

答案 0 :(得分:2)

因为你没有改变可观察的集合,你只需要改变对“点”数据变量的引用。 CollectionChanged事件在每次更改时触发ObservableCollection对象(insert,remove,...),但在这种情况下它不会触发事件,因为你没有更改实际对象。

如果您希望触发事件,请尝试(可能多次触发事件)

data.Clear();
foreach (var obj in another_data)
{
    data.Add(obj);
}

如果需要通知引用交换的所有观察者,可以通过多种方法之一来创建observablecollection类的子类(因为OnCollectionChanged方法受到保护):

     class SomeOtherClass<T> : ObservableCollection<T>
    {
        public void InvokeAllOnChangedObservers()
        {
            OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); // or OnCollectionChanged(null);
        }
    }

    static void Main(string[] args)
    {
        SomeOtherClass<string> a = new SomeOtherClass<string>();
        a.CollectionChanged += (sender, evnt) =>
        {
            Console.WriteLine("Handler");
        };

        a.InvokeAllOnChangedObservers(); // prints handler
    }

您还可以创建对象所订阅的事件到您的基类(包含observablecollection)并通知该事件的所有订阅者。在这种情况下,您的类需要订阅ObservableCollection CollectionChanged事件并将收到的args重新发送给所有订阅者......

您还可以查看此example并尝试在您的情况下使用