是否有必要取消订阅在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事件(见上文)仍然被订阅,并且不允许被删除的项目被垃圾收集。我怎么能克服这一点。如果我错了,请纠正我。
答案 0 :(得分:3)
不,您不必取消订阅这些活动。当您的窗口关闭时,该窗口的所有内容都将被丢弃,因此不需要取消订阅,也不会发生内存泄漏。如果您真的想取消订阅代码隐藏中的某个事件,例如要暂时关闭该事件,您可以按照default method。
中的说明执行此操作至于您的MyCellStyle2
方案,我仍然认为您不必担心事件取消订阅。在您所描述的安排中,您的Window
包含对您ListBox
的引用,Window
包含对该项目的引用,该引用又包含对Window
所揭示事件的引用,对ListBox
的引用。请注意,它是引用事件的项目,而不是相反的项目,因为当发生某些事情时,它应该调用应该调用相应事件的项目。因此,当项目从ModelA:
fields: id, name, category
中删除时,它应该被垃圾收集,因为它的引用被释放,即使它持有对其他对象的引用。
另一方面,如果您确实发现这些项目在被删除后内存泄漏,可能还有其他原因。您很可能会遇到How to: Subscribe to and Unsubscribe from Events,this和this中描述的问题。解决方法是实现INotifyPropertyChanged接口。
答案 1 :(得分:0)
无需取消订阅在Xaml中创建的事件。您需要取消订阅在Code Behind中创建的事件。
例如:
this.MouseDoubleClick + = UserControl1_MouseDoubleClick;
this.MouseDoubleClick - = UserControl1_MouseDoubleClick;