我需要根据 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/