我是新手使用Commands并尝试使用CanExecute来启用和禁用我的按钮,具体取决于某些因素。但我做错了什么,无法弄明白。加载时工作正常。 CanExecuteGenerate函数被命中,模型为null,因此返回false。 UI上的按钮被禁用。但是从那以后它永远不会再次击中CanExecuteGenerate,导致我的按钮保持禁用状态。任何人都可以看到我错过或做错了吗?
public class MainWindowViewModel: PropertyChangedNotification{
public RelayCommand GenerateCommand { get; set; }
public MainWindowViewModel( ) {
GenerateCommand = new RelayCommand( OnGenerateClicked, CanExecuteGenerate( ) );
Model = new MainModel( );
}
private Func<bool> CanExecuteGenerate( ) {
if( Model != null ) {
return ( ) => ( Model.Name != "" && Model.Title != "" ) ? true : false;
}
return ( ) => false;
}
public void someothermethod(){
Model.Name = "James"
Model.Title = "Doctor"
GenerateCommand.RaiseCanExecuteChanged();
}
public void OnGenerateClicked(){
//Do some other stuff
}
}
答案 0 :(得分:1)
创建RelayCommand
时,总是传递返回false的方法。
当model为null时,不应为该情况创建单独的方法,而是要在传递给RelayCommand
的方法中处理它。
尝试使用此方法:
private bool CanExecuteGenerate( ) {
if( Model != null ) {
return Model.Name != "" && Model.Title != "";
}
return false;
}
并将RelayCommand
的构造更改为
GenerateCommand = new RelayCommand(OnGenerateClicked, CanExecuteGenerate);
答案 1 :(得分:0)
因为您的CanExecuteGenerate方法返回将被调用的委托。试试这个:
public class MainWindowViewModel: PropertyChangedNotification{
public RelayCommand GenerateCommand { get; set; }
public MainWindowViewModel( ) {
GenerateCommand = new RelayCommand( OnGenerateClicked, CanExecuteGenerate);
Model = new MainModel( );
}
private bool CanExecuteGenerate( ) {
if( Model != null )
return ( Model.Name != "" && Model.Title != "" ) ? true : false;
return false;
}
public void someothermethod(){
Model.Name = "James"
Model.Title = "Doctor"
GenerateCommand.RaiseCanExecuteChanged();
}
public void OnGenerateClicked(){
//Do some other stuff
}
}