gpt4 book ai didi

c# - 如何克隆 ObservableCollection.CollectionChanged 事件?

转载 作者:行者123 更新时间:2023-11-30 21:05:04 25 4
gpt4 key购买 nike

我正在尝试将 ObservableCollection 复制到 ObservableCollection 派生类型中,并且我想保留 CollectionChanged 事件。

到目前为止我有:

public class PartitionCollection : ObservableCollection<AislePartition>
{
public PartitionCollection(ObservableCollection<AislePartition> other)
: base(other)
{

}

// ...

protected override void InsertItem(int index, AislePartition item)
{
// Important custom logic runs here
if (/* */)
base.InsertItem(index, item);
else
Merge(item);
}

protected void Merge(AislePartition item)
{
// ...
}
}

它可以很好地复制集合,但我也需要获取 CollectionChanged 事件。

有什么办法吗?谢谢

编辑:

前: Before the constructor call后: After the constructor call

使用这个特定构造函数的代码:

    private static void OnSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
AisleSelection aisleSelect = args.NewValue as AisleSelection;
if (aisleSelect.Partitions == null)
aisleSelect.Partitions = new PartitionCollection();
else
aisleSelect.Partitions = new PartitionCollection(aisleSelect.Partitions);
...
}

本质上,我要做的是用我的 PartitionCollection 替换 ObservableCollection,它会覆盖一些关键成员。 ObservableCollection 是从服务器以序列化形式传给我的,所以我无法直接使用它。

最佳答案

如果我对你的问题的理解正确,你想用另一个替换 on observable 集合,但你仍然希望旧集合上的事件订阅者在新集合发生变化时得到通知。

如果这是正确的,您需要的是使旧集合与新集合保持同步。新集合应保留对旧(源)集合的引用,并且每当修改新集合时,您都对旧集合执行相同的修改。

PartitionCollection你可以覆盖 ClearItems , InsertItem , RemoveItemSetItem并在调用新集合中方法的基类实现后将更改转发到旧集合。这应该保持同步。

如果您绝对只想要该系列的一个副本,您可以派生 PartitionCollection来自 IObservableCollection<AislePartition>并为您提供自己的接口(interface)实现。该集合的后备存储应该是旧集合。此解决方案非常繁琐,因为您必须实现许多方法,这些方法只是转发到包装集合上的相同方法,但您要确保集合未被复制。

如果可以通过包装器以外的其他方式修改旧集合,则您必须订阅旧集合的更改并从包装器中触发类似的事件。

有一些"evil" tricks如果您真的愿意,这可能允许您访问旧集合的调用列表。不过,我会三思而后行。

关于c# - 如何克隆 ObservableCollection<T>.CollectionChanged 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11905173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com