卸载用户控件时从 ViewModel 中删除事件
Posted
技术标签:
【中文标题】卸载用户控件时从 ViewModel 中删除事件【英文标题】:Remove event from ViewModel when the User Control is unloading 【发布时间】:2017-07-26 09:41:01 【问题描述】:在我的代码中,我在加载事件期间将我的 VM 上的一个事件附加到用户控件上的一个方法,现在我想在卸载用户控件时删除该事件,我该怎么做?
在虚拟机
public delegate bool CheckCondition();
public class VMClass
event CheckCondition Check;
在用户控制下
public partial class AControl:UserControl
public AControl()
InitializeComponent();
Loaded += (s, e) =>
VM.Check +=() => CheckingCode();
public VMClass VM => (VMClass)DataContext;
我正在考虑使用UnLoaded事件,但问题是在UnLoaded事件时,DataContext已经为null,所以无法取消订阅该事件,即:
UnLoaded +=(s, e) =>
VM.Check -=() => CheckingCode();
不起作用,因为 VM
已经是 null
UnLoaded
。
当卸载用户控件时,如何删除附加到VM.Check
的事件?
【问题讨论】:
你不能在视图模型中使用事件;但是使用 Messenger.Register / Send 如下所述_所以你不会得到死链接marcominerva.wordpress.com/2014/06/25/… 附注:事件应该遵循EventHandler
委托模式。
【参考方案1】:
您可以使用DataContextChanged
事件。
DataContextChanged += (object sender, DependencyPropertyChangedEventArgs e) =>
var oldVM = e.OldValue as VMClass;
var newVM = e.NewValue as VMClass;
if (oldVM != null)
oldVM.Check -= CheckingCode;
if (newVM != null)
newVM.Check += CheckingCode;
【讨论】:
以上是关于卸载用户控件时从 ViewModel 中删除事件的主要内容,如果未能解决你的问题,请参考以下文章
当用户在我们的应用程序运行时从音乐应用程序中删除歌曲时,我希望在我们的应用程序中删除歌曲事件
怎样找到并卸载控件(不是插件,不是软件,添加删除程序里找不到)谢谢
IE9 - 添加和删除 DOM 元素会破坏父 keydown 事件