c# - 如何使用反射附加事件处理程序

标签 c# events mvvm reflection

我需要根据 ViewModel 的命令更新功能区按钮的启用状态。由于 VSTO 功能区不(还?)支持良好的旧命令绑定(bind),我试图通过收听 CanExecuteChanged 来实现这一点。所有事件RelayCommand我的 ViewModel 的属性。我认为我不会单独附加每个属性,而是使用反射并获取 RelayCommand 的所有属性在循环中键入并附加我的处理程序。

我可以使用以下简单代码获取所有属性:

var props = VM.GetType().GetProperties();
foreach (var prop in props)
{
  if (prop.PropertyType == typeof(RelayCommand))
     ????.CanExecuteChanged += MyHandler;
}

我需要写什么来代替???? ?

最佳答案

一旦你找到了 RelayCommand 类型的属性, 将自己作为处理程序添加到其 CanExecuteChanged事件,您需要:

  • 检索属性值。
  • 将属性值转换为 RelayCommand
  • 订阅事件。

  • 例如。
    if (prop.PropertyType == typeof(RelayCommand))
    {
        RelayCommand command = (RelayCommand)prop.GetValue(VM);
    
        command.CanExecuteChanged += MyHandler;
    }
    

    最后注意 CanExecuteChanged事件实际上是在 ICommand 中声明的接口(interface),RelayCommand 的典型实现(它不是标准的 .NET 类型,而是常用的 WPF 习惯用法)。所以你可能更喜欢这样的东西:
    if (typeof(ICommand).IsAssignableFrom(prop.PropertyType))
    {
        ICommand command = (ICommand)prop.GetValue(VM);
    
        command.CanExecuteChanged += MyHandler;
    }
    

    关于c# - 如何使用反射附加事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35144920/

    相关文章:

    c# - 如何使用CommandParameter发送列表

    javascript - Jquery - 将事件添加到与其他人共享类名的特定 div

    silverlight - 隔离存储MVVM Silverlight抛出NotSupportedException

    c# - 如何使用 DataTemplates 通过 ViewModel-First 方法缓存动态切换的 View

    c# - 在这种情况下如何调用 ICommand.CanExecute?

    C# 在图像中查找边界区域

    c# - Visual Studio 代码(使用 C#): While putting debugger point then showing me "No Symbol loaded for this document"

    c# - 使用属性名称的字符串表示在 LINQ C# 中计算平均值

    javascript - 添加按键事件

    Mysql事件执行开始时间