我有一组定义如下的数据(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>
为什么不能处理赋值事件?以及如何使其发挥作用?
答案 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并尝试在您的情况下使用