MVVM Light RelayCommand无法正常工作

时间:2016-05-20 10:22:35

标签: c# wpf mvvm-light relaycommand

我是新手使用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
    }



}

2 个答案:

答案 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
   }
}