C# 处理分配事件
我有一个定义如下的数据集合(C# 处理分配事件,c#,wpf,binding,assignment-operator,C#,Wpf,Binding,Assignment Operator,我有一个定义如下的数据集合(MyData被定义为一个类): 如果我只是从数据中添加或删除元素,它会工作得很好,也就是说,每当这些操作发生时,它会自动调用另一个\u func() 但是,当我尝试为数据赋值时,它不起作用(不会触发另一个函数()),例如: data = another_data; // another_data also with type ObservableCollection<MyData> data=另一个数据;//另一个_数据也具有ObservableColl
MyData
被定义为一个类):
如果我只是从数据中添加或删除元素,它会工作得很好,也就是说,每当这些操作发生时,它会自动调用另一个\u func()
但是,当我尝试为数据
赋值时,它不起作用(不会触发另一个函数()
),例如:
data = another_data; // another_data also with type ObservableCollection<MyData>
data=另一个数据;//另一个_数据也具有ObservableCollection类型
为什么这个不能处理分配事件?以及如何使其工作?因为您没有更改可观察的集合,所以您只需更改对哪个“points”数据变量的引用。CollectionChanged事件在每次更改(插入、删除等)时触发ObservableCollection对象,但在这种情况下它不会触发事件,因为您并没有更改实际对象 如果您希望触发事件,请尝试以下操作(它可能会多次触发事件) 如果您需要在引用交换时通知所有观察者,许多方法之一是创建ObservaleCollection类的子类(因为OnCollectionChanged方法受保护):
class SomeOtherClass:ObservableCollection
{
public void InvokeAllOnChangedObservers()
{
OnCollectionChanged(新建NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));//或OnCollectionChanged(null);
}
}
静态void Main(字符串[]参数)
{
SomeOtherClass a=新的SomeOtherClass();
a、 CollectionChanged+=(发送方,evnt)=>
{
控制台。WriteLine(“处理程序”);
};
a、 InvokeAllOnChangedObservers();//打印处理程序
}
您还可以为基类(包含observablecollection)创建对象订阅的事件,并用该事件通知所有订阅方。在这种情况下,您的类需要订阅ObservableCollection CollectionChanged事件,并将收到的参数重新发送给所有订阅者
您也可以查看此信息,并尝试在您的案例中使用它我可以在分配后简单地伪造一个
CollectionChanged
标志吗?
data.CollectionChanged += data_CollectionChanged;
...
void data_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
another_func();
}
data = another_data; // another_data also with type ObservableCollection<MyData>
data.Clear();
foreach (var obj in another_data)
{
data.Add(obj);
}
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
}