即使使用正确的指令也无法识别 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 属性.
的一种类型
我仍在学习 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 属性.
的一种类型