C# 切换到MVVMLight时出现CanExecute问题
我一直在使用我从一篇文章()中复制的C# 切换到MVVMLight时出现CanExecute问题,c#,wpf,mvvm-light,C#,Wpf,Mvvm Light,我一直在使用我从一篇文章()中复制的RelayCommand,下面的CreateExamCommand工作正常,CanExecute绑定到“Name”是否为空 XAML Csharp public RelayCommand CreateExamCommand=>new RelayCommand( ()=>CreateExam(名称、日期), ()=>!string.IsNullOrEmpty(\u name) ); 但是,我只是安装了MVVMLightLibs,以替换手动复制的代码(并删除
RelayCommand
,下面的CreateExamCommand
工作正常,CanExecute
绑定到“Name”是否为空
XAML
Csharp
public RelayCommand CreateExamCommand=>new RelayCommand(
()=>CreateExam(名称、日期),
()=>!string.IsNullOrEmpty(\u name)
);
但是,我只是安装了MVVMLightLibs,以替换手动复制的代码(并删除了我的RelayCommand
)。现在,CreateExamCommand
的CanExecute
方法被破坏
我将一些WriteLine
s放在CanExecute
中,它似乎只在首次加载视图(模型)时运行
如何修复此问题?这取决于您使用的MVVMLight的RelayCommand版本 如果您具有名称空间“GalaSoft.MvvmLight.CommandWpf”,那么您的命令将使用CommandManager对象,并在每次击键或鼠标单击后自动刷新CanExecute
如果您有“GalaSoft.MvvmLight.Command”,那么您必须手动触发CanExecute-在Name属性的setter中添加
CreateExamCommand.RaiseCanecuteChanged()
。实际上,我刚开始使用PropertyChanged.Fody。但是这个答案显然是正确的和相关的。使用Fody.PropertyChanged的少数缺点之一是没有setter可以用作触发器,而不是说这一定是刷新命令的正确位置。我在博客中讨论了另一种方法-