【问题标题】:MVVM Light RelayCommand not workingMVVM Light RelayCommand 不起作用
【发布时间】:2016-05-20 10:22:35
【问题描述】:

我是使用命令的新手,我正在尝试 CanExecute 根据某些因素启用和禁用我的按钮。但我做错了什么,无法弄清楚。加载时工作正常。 CanExecuteGenerate 函数被命中,模型为空,因此返回 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
    }



}

【问题讨论】:

    标签: c# wpf mvvm-light relaycommand


    【解决方案1】:

    当你创建 RelayCommand 时,你总是传递返回 false 的方法。

    你不应该为模型为空的情况创建一个单独的方法,而是在你传递给RelayCommand的方法中处理它。

    试试这个方法:

    private bool CanExecuteGenerate( ) {
        if( Model != null ) {
            return Model.Name != "" && Model.Title != "";
        }
    
        return false;
    } 
    

    并将RelayCommand的构造更改为

    GenerateCommand = new RelayCommand(OnGenerateClicked, CanExecuteGenerate);
    

    【讨论】:

    • 谢谢,很高兴看到我走在了正确的轨道上,因为我尝试了不同的 RelayCommand 类,我忘了把它改成一个方法。
    【解决方案2】:

    因为您的 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
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 2014-08-04
      • 2011-06-16
      • 1970-01-01
      相关资源
      最近更新 更多