如何使用Reflection附加事件处理程序

时间:2016-02-02 04:13:46

标签: c# events mvvm reflection

我需要根据我的ViewModel命令更新功能区按钮的启用状态。由于VSTO Ribbons(但是?)不支持良好的旧命令绑定,我试图通过监听ViewModel的所有CanExecuteChanged属性的RelayCommand事件来实现此目的。我没有单独附加每个属性,而是认为我使用Reflection并获取RelayCommand类型的所有属性并将我的处理程序附加到循环中。

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

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

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

1 个答案:

答案 0 :(得分:1)

找到类型为RelayCommand的属性后,要将自己添加为CanExecuteChanged事件的处理程序,您需要:

  1. 检索属性值。
  2. 将属性值转换为RelayCommand
  3. 订阅活动。
  4. E.g。

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

    最后请注意,CanExecuteChanged事件实际上是在ICommand接口中声明的,这是RelayCommand的典型实现(不是标准的.NET类型,而是常用的WPF)成语)。所以你可能更喜欢这样的东西:

    if (typeof(ICommand).IsAssignableFrom(prop.PropertyType))
    {
        ICommand command = (ICommand)prop.GetValue(VM);
    
        command.CanExecuteChanged += MyHandler;
    }