【问题标题】:Handle assignment event处理分配事件
【发布时间】:2014-04-07 05:09:52
【问题描述】:

我有一个定义如下的数据集合(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()

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

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

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

【问题讨论】:

    标签: c# wpf binding assignment-operator


    【解决方案1】:

    这是因为您没有更改可观察集合,您只是更改了对“点”数据变量的引用。 CollectionChanged 事件在每次更改(插入、删除、...)时触发 ObservableCollection 对象,但在这种情况下它不会触发事件,因为您没有更改实际对象。

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

    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 并尝试是否可以在您的情况下使用它

    【讨论】:

    • 我可以在分配后简单地伪造CollectionChanged 标志吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 2012-05-31
    • 1970-01-01
    相关资源
    最近更新 更多