即使使用正确的指令也无法识别 RaiseCanExecuteChanged

RaiseCanExecuteChanged is not recognized even with the right directive

我仍在学习 mvvm 并使用 c# 进行编码,但我遇到了一个我不知道如何解决的问题。我的项目似乎无法识别

RaiseCanExecuteChanged 

即使我在使用

System.Windows.Input;

我使用 MVVM Light 并且在 NET4.5

我不断收到的错误是

`System.Windows.Input.ICommand` does not contain a definition for '`RaiseCanExecuteChanged`' and no extension method '`RaiseCanExecuteChanged`' accepting a first argument of type 'System.Windows.Input.Icommand' could be found(are you missing a using directive or an assembly reference?)

以前有人 运行 处理过这个问题吗?感谢您的帮助

这是我在视图模型中用来创建命令的代码

public class NetworkingViewModel : ViewModelBase, INotifyPropertyChanged
{

 public NetworkingViewModel()
    {
       AddPersonCommand = new RelayCommand(AddPerson,CanAddName );
    }

 public ICommand AddPersonCommand {get; private set;}

 private void AddPerson()
    {
        *adds person to an observableCollection*
    }
 private bool CanAddName()
    {
        return !string.IsNullOrEmpty(Group);   
    }

 public string Group   // the Name property
    {
        get { return _group; }
        set 
        { 
            if(value !=_group)
            {
                _group = value;
                RaisePropertyChanged("Group");
                AddPersonCommand.RaiseCanExecuteChanged();
            }
        }
    }
}

ICommand 没有 RaiseCanExecuteChanged,但是 RelayCommand(您正在使用的)有...所以您可以尝试强制转换或其他方式:

var myCommand = AddPersonCommand as RelayCommand;
if(myCommand != null) 
  myCommand.RaiseCanExecuteChanged();

如果您使用的是 MVVM Light,您可能应该使用 RelayCommands 而不是 ICommands,以及 MVVM Light 的 RaiseCanExecuteChanged。这是在 GalaSoft.MvvmLight.Command 命名空间中(或者可能是 GalaSoft.MvvmLight.CommandWpf 命名空间 - http://blog.galasoft.ch/posts/2015/01/re-enabling-the-commandmanager-feature-with-relaycommand-in-mvvm-light-v5 )。参考那个而不是 System.Windows.Input .

参见: http://www.mvvmlight.net/help/NET45/html/404e779f-7c2b-875f-bf17-b8ad84bfb7ef.htm

只需将您的命令属性定义为中继命令:

public ICommand AddPersonCommand {get;私有集;}

public RelayCommand AddPersonCommand {get; private set;}

正如@Bijington 在评论中所说,RaiseCanExecuteChanged 在 ICommand 中不存在。 ICommand 有 CanExecute 方法,它应该可以工作。 或者您可以将 AddPersonCommand 转换为组 属性 setter 内的 RelayCommand,或者从一开始就将 RelayCommand 用作 AddPersonCommand 属性.

的一种类型