Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何克隆ObservableCollection.CollectionChanged事件?_C#_Silverlight - Fatal编程技术网

C# 如何克隆ObservableCollection.CollectionChanged事件?

C# 如何克隆ObservableCollection.CollectionChanged事件?,c#,silverlight,C#,Silverlight,我正在尝试将ObservaleCollection复制到ObservaleCollection派生类型,并希望保留CollectionChanged事件 到目前为止,我已经: public class PartitionCollection : ObservableCollection<AislePartition> { public PartitionCollection(ObservableCollection<AislePartition> other)

我正在尝试将ObservaleCollection复制到ObservaleCollection派生类型,并希望保留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)
    {
         // ...
    }
}

本质上,我试图用我的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);
    ...
    }