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
    }