c# - 当用户控件卸载时从 ViewModel 中删除事件

标签 c# wpf events

在我的代码中,我在加载事件期间将虚拟机上的事件附加到用户控件上的方法,现在我想在卸载用户控件时删除该事件,我该怎么做?

在虚拟机

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(); 

不起作用,因为VMUnLoaded处已经是null

卸载用户控件时如何删除附加到 VM.Check 的事件?

最佳答案

您可以使用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;
    }
}

关于c# - 当用户控件卸载时从 ViewModel 中删除事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45323145/

相关文章:

c# - 如何在 .NET 中获取 Unix 时间戳?

wpf - 如何以编程方式切换功能区选项卡?

c# - 是否有任何默认策略来为决议变更准备申请?

wpf - 在主窗口的网格中打开用户控件 - WPF

iphone - 覆盖 UIScrollview 而不切断 ScrollView 的触摸事件

c# - 如何从 XML 文件中读取摘要

c# - 求日期之间的天数 C#

c# - 是否可以记住 WPF 中工具栏托盘上的工具栏位置?

c++ - IE9 无法在 BHO 中的 HTMLWindow2 上触发 onscroll 事件

Javascript 事件监听器性能