2012-07-05 18 views
0

的问题是,在我看来,我订阅了一个CollectionChanged事件,像这样:)如何重置内置事件为空,这样一个视图,可以配置

的InitializeComponent(; CollectionChanged + = SomeMethod

每当DataTemplate重绘视图时,它总是会将SomeMethod链接到CollectionChanged。 我认为,由于参考旧视图不会GC'd。我怀疑这可能是我所遇到的泄漏的原因。 我需要将SomeMethod注册到CollectionChanged,所以问题是......我如何清除CollectionChanged。 UserControl是否有一种方法来清除所有订阅事件? 谢谢。

+1

CollectionChanged - =的someMethod? – 2012-07-05 22:17:50

+0

我知道,但我会把它放在哪里?在构造函数中呢? 所以你说 'CollectionChanged - =的someMethod;'' + CollectionChanged =的someMethod;' – 2012-07-05 22:30:36

回答

1

您拥有沿东西线的假设:

public Form1() 
    { 
     InitializeComponent(); 
     collection.CollectionChanged += new NotifyCollectionChangedEventHandler(collection_CollectionChanged); 
    } 

而且假设收集的生活比这更长的表格,那么上面的事件处理程序将防止形式被垃圾收集。假设你正在创建每次显示它的时候一种新的形式,你可以在窗体的FormClosed事件退订,沿着线:

public Form1() 
    { 
     InitializeComponent(); 
     collection.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(collection_CollectionChanged); 
     FormClosed += new FormClosedEventHandler(Form1_FormClosed); 
    } 

    void Form1_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     collection.CollectionChanged -= new System.Collections.Specialized.NotifyCollectionChangedEventHandler(collection_CollectionChanged); 
    } 
+0

正是我的想法:) – thmsn 2012-07-06 08:17:44

+0

感谢编辑@tomas - 复制/粘贴 – Michael 2012-07-06 08:30:06

+0

呀感谢的罪恶。在我看到这篇文章之前,我使用了Unload事件。这样也能工作吗? – 2012-07-08 20:29:39

相关问题