是否有必要取消订阅在xaml WPF中订阅的事件,如果是,如何取消订阅事件?

时间:2015-06-24 06:33:34

标签: wpf xaml

是否有必要取消订阅在Xaml WPF中订阅的事件?如果是这样,我如何取消订阅活动?在下面的代码中,我订阅了Xaml中的MouseDown和OnCellClosed事件。如果真的有必要取消订阅事件那么我怎么能实现这个?

<DataTemplate  x:Key="Style2">
     <local:MyCellStyle2 MouseDown="MyCellStyle2_MouseDown" OnCellClosed="MyCellStyle2_OnCellClosed"   />
</DataTemplate>

更新: 我正在使用带有上面定义的itemtemplate的listBox。列表框中的每个项目都将与datatemplate“MyCellStyle2”一起显示。这个“MyCellStyle2”控件有一个关闭按钮,当单击时,对象将从列表框的集合中删除,但对象的mousedown和OnCellClosed事件(见上文)仍然被订阅,并且不允许被删除的项目被垃圾收集。我怎么能克服这一点。如果我错了,请纠正我。

2 个答案:

答案 0 :(得分:3)

不,您不必取消订阅这些活动。当您的窗口关闭时,该窗口的所有内容都将被丢弃,因此不需要取消订阅,也不会发生内存泄漏。如果您真的想取消订阅代码隐藏中的某个事件,例如要暂时关闭该事件,您可以按照default method

中的说明执行此操作

更新

至于您的MyCellStyle2方案,我仍然认为您不必担心事件取消订阅。在您所描述的安排中,您的Window包含对您ListBox的引用,Window包含对该项目的引用,该引用又包含对Window所揭示事件的引用,对ListBox的引用。请注意,它是引用事件的项目,而不是相反的项目,因为当发生某些事情时,它应该调用应该调用相应事件的项目。因此,当项目从ModelA: fields: id, name, category 中删除时,它应该被垃圾收集,因为它的引用被释放,即使它持有对其他对象的引用。

另一方面,如果您确实发现这些项目在被删除后内存泄漏,可能还有其他原因。您很可能会遇到How to: Subscribe to and Unsubscribe from Eventsthisthis中描述的问题。解决方法是实现INotifyPropertyChanged接口。

答案 1 :(得分:0)

无需取消订阅在Xaml中创建的事件。您需要取消订阅在Code Behind中创建的事件。

例如:

this.MouseDoubleClick + = UserControl1_MouseDoubleClick;

this.MouseDoubleClick - = UserControl1_MouseDoubleClick;