C# 如何克隆ObservableCollection.CollectionChanged事件?
我正在尝试将ObservaleCollection复制到ObservaleCollection派生类型,并希望保留CollectionChanged事件 到目前为止,我已经:C# 如何克隆ObservableCollection.CollectionChanged事件?,c#,silverlight,C#,Silverlight,我正在尝试将ObservaleCollection复制到ObservaleCollection派生类型,并希望保留CollectionChanged事件 到目前为止,我已经: public class PartitionCollection : ObservableCollection<AislePartition> { public PartitionCollection(ObservableCollection<AislePartition> other)
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)
{
// ...
}
}
本质上,我试图用我的PartitionCollection替换ObservableCollection,它覆盖了几个关键成员。ObservableCollection是以序列化形式从服务器传递给我的,因此我无法直接使用它。如果我正确理解了您的问题,您希望用另一个集合替换ObservableCollection,但您仍然希望在新集合更改时通知旧集合上事件的订阅者 如果这是正确的,那么您需要保持旧集合与新集合同步。新集合应保留对旧源集合的引用,并且每当修改新集合时,都会对旧集合执行相同的修改 在PartitionCollection中,您可以重写ClearItems、InsertItem、RemoveItem和SetItem,并在调用新集合中方法的基类实现后将更改转发到旧集合。这将保持同步
如果您绝对只需要集合的单个副本,则可以从IObservableCollection派生PartitionCollection,如果确实需要,可以使用它访问旧集合的调用列表。但是,在这样做之前,我会三思而后行。如果我正确理解了您的问题,您希望用另一个集合替换可观察集合上的事件,但您仍然希望在新集合更改时通知旧集合上事件的订阅者 如果这是正确的,那么您需要保持旧集合与新集合同步。新集合应保留对旧源集合的引用,并且每当修改新集合时,都会对旧集合执行相同的修改 在PartitionCollection中,您可以重写ClearItems、InsertItem、RemoveItem和SetItem,并在调用新集合中方法的基类实现后将更改转发到旧集合。这将保持同步
如果您绝对只需要集合的单个副本,则可以从IObservableCollection派生PartitionCollection,如果确实需要,可以使用它访问旧集合的调用列表。但是,在这样做之前,我会三思而后行。您不能将事件处理程序从一个对象复制到另一个对象,因为事件只提供两种方法来添加处理程序和删除处理程序。。。换句话说,您不能枚举处理程序并将其添加到新对象事件中 我的建议是对旧对象进行弱处理或强处理,并提供一个内部事件处理程序,该处理程序首先调用事件的所有订阅者,然后调用所提供对象上的事件
请记住,如果使用强引用,只要当前对象处于活动状态,旧对象就会保持活动状态,因此,这可能会导致内存泄漏或内存过度使用。您不能将事件处理程序从一个对象复制到另一个对象,因为事件只提供两种方法来添加处理程序和删除处理程序。。。换句话说,您不能枚举处理程序并将其添加到新对象事件中 我的建议是对旧对象进行弱处理或强处理,并提供一个内部事件处理程序,该处理程序首先调用事件的所有订阅者,然后调用所提供对象上的事件
请记住,如果使用强引用,只要当前对象处于活动状态,旧对象就会保持活动状态,因此可能会导致内存泄漏或内存过度使用。克隆事件是什么意思?我的意思是需要将所有处理程序复制到新事件中,并丢弃旧事件。在C++中,CopyTexEngEnter=STD::但是这不是C++:你指的是克隆一个事件?我的意思是我需要把所有的处理程序复制到一个新的事件中,然后丢弃旧的。在C++中,CopyTexEngEnter=STD::但这不是C++:不,他正在提供另一个对象,他想把事件处理程序从另一个对象复制到构造函数中的新对象。如果我将事件处理程序添加到A上的事件中,然后从B触发该事件,这不是意外吗?我没有将处理程序添加到B,只是添加到A。是的,你是对的,但这就是问题的背景。什么是合理的或不合理的实际上取决于很多因素,其中更好的部分与里程碑、交付压力和管理压力有关:我不是说这是一个好的做法,我是说我将解决它的方式,但正如你所说,这样做有点奇怪。是的,我应该解释一下
为了更好地理解我的意图,要丢弃原始对象,我只想保留它的事件处理程序和集合项,因为我用更专门的类PartitionCollection替换它。ObservableCollection是在我无法控制更改它的其他地方出现的。我想你理解得没错,唯一的一点是我不需要旧的集合,我认为有两个副本可能是浪费。也可能是我误解了解决方案。来自C++背景下,我半预料到这样的事情。CopyTrchange=At.CopyTochange变为工作。不,他正在提供另一个对象,他想将事件处理程序从另一个对象复制到构造函数中的新对象。@ JOGEC C RDOBA:但是这是明智的吗?如果我将事件处理程序添加到A上的事件中,然后从B触发该事件,这不是意外吗?我没有将处理程序添加到B,只是添加到A。是的,你是对的,但这就是问题的背景。什么是合理的或不合理的实际上取决于很多因素,其中更好的部分与里程碑、交付压力和管理压力有关:我不是说这是一个好的做法,我是说我将解决它的方式,但正如你所说,这样做有点奇怪。是的,我应该更好地解释我的意图,原始对象将被丢弃,我只想保留它的事件处理程序和集合项,因为我用更专门的类PartitionCollection替换它。ObservableCollection是在我无法控制更改它的其他地方出现的。我想你理解得没错,唯一的一点是我不需要旧的集合,我认为有两个副本可能是浪费。也可能是我误解了解决方案。从C++背景来看,我半预料到这样的事情。CopyTrime=其他。收藏变为工作。听起来很有趣,但是原始对象要被销毁,我用新的对象来替换它。最坏的情况是我这样做,因为我可以保证在整个程序中只有一个特定对象的实例。听起来很有趣,但是原始对象将被销毁,我将用新对象替换它。最坏的情况下,我会这样做,因为我可以保证在整个程序中只有一个特定对象的实例。
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);
...
}