Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 启用委派命令_C#_Wpf_Xaml_Button - Fatal编程技术网

C# 启用委派命令

C# 启用委派命令,c#,wpf,xaml,button,C#,Wpf,Xaml,Button,有点困惑 如果我在wpf窗口中有一个按钮并将其绑定到DelegateCommand <Button Grid.Row="1" Content="Remove" Command="{Binding CommandDelete }" /> 到目前为止,我觉得这很好,唯一缺少的是为SelectedReport的setter中的特定按钮引发CanExecute事件 CommandDelete.RaiseCanExecuteChanged(); 这是可行的,但我的问题是,如果我有10个按

有点困惑

如果我在wpf窗口中有一个按钮并将其绑定到DelegateCommand

<Button Grid.Row="1"  Content="Remove" Command="{Binding CommandDelete }" />
到目前为止,我觉得这很好,唯一缺少的是为SelectedReport的setter中的特定按钮引发CanExecute事件

CommandDelete.RaiseCanExecuteChanged();

这是可行的,但我的问题是,如果我有10个按钮,那么每次选择一个项目时,我是否需要为每个按钮调用RaiseCanceTechChanged,或者是否以更智能的方式存在?

通常我会将我的
RaiseCanceTechChanged()
放在该类的
PropertyChanged
事件中

例如,如果
DeleteCommand.CanExecute
基于
SelectedReport
属性,我将钩住
ViewModel
PropertyChanged
事件,并在
SelectedReport
更改时随时引发
CanExecuteChanged
事件

void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "SelectedReport")
        DeleteCommand.RaiseCanExecuteChanged();
}
这将所有逻辑保持在一个中心位置,并确保每当其中一个参数更改时,都会引发
CanExecuteChanged


另一种选择是从使用
DelegateCommand
切换到
RelayCommand
,当属性更改时,该命令会自动提高其
CanExecuteChanged
。我会假设存在性能差异,但我从未注意到。

谢谢,实现了它,工作起来很有魅力。让代码保持干净一点
CommandDelete.RaiseCanExecuteChanged();
void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "SelectedReport")
        DeleteCommand.RaiseCanExecuteChanged();
}