我需要根据我的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;
}
我需要写什么代替????
?
答案 0 :(得分:1)
找到类型为RelayCommand
的属性后,要将自己添加为CanExecuteChanged
事件的处理程序,您需要:
RelayCommand
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;
}