我无法从MVVM Light中获取RelayCommand以在WPF应用程序中工作,特别是当我尝试使用CanExecute委托时。如果我将第二个参数添加到命令的构造函数中,MainWindow永远不会启动,我必须从任务管理器中删除该应用程序。如果我删除第二个参数,这个问题就消失了。我四处搜索并发现MVVM Light切换到便携式类库,这导致了CanExecute委托的一些问题。我已经尝试回到MVVM Light版本4.2.32.7,并尝试使用Galasoft.MvvmLight.CommandWpf命名空间,但这些都没有帮助。
我还应该提到没有构建错误(它表示构建成功)或编译错误发生。以下是我发现问题的一些简单代码:
public class MainViewModel : ViewModelBase
{
public MainViewModel()
{
}
private string myString;
public string MyString
{
get { return myString; }
set { Set("MyString", ref myString, value); }
}
private string myOtherString;
public string MyOtherString
{
get { return myOtherString; }
set { Set("MyOtherString", ref myOtherString, value); }
}
private RelayCommand myCommand;
public RelayCommand MyCommand
{
get
{
return myCommand ??
(myCommand = new RelayCommand(
() => MyOtherString = MyString,
() => MyString.Length > 5));
}
}
}
我的视图只有两个文本框:一个绑定到MyString,另一个绑定到MyOtherString。还有一个绑定到MyCommand的按钮。有谁知道为什么使用CanExecute参数会破坏我的应用程序?
答案 0 :(得分:0)
viewmodel中的MyString属性在启动期间为null并抛出空引用。因此要么对CanExecute进行null检查,要么将默认值赋给MyString属性。请参阅下面的代码。
public class MainViewModel : ViewModelBase
{
public MainViewModel()
{
}
private string myString = string.Empty;
public string MyString
{
get { return myString; }
set { Set("MyString", ref myString, value); }
}
private string myOtherString;
public string MyOtherString
{
get { return myOtherString; }
set { Set("MyOtherString", ref myOtherString, value); }
}
private RelayCommand myCommand;
public RelayCommand MyCommand
{
get
{
return myCommand ??
(myCommand = new RelayCommand(
() => MyOtherString = MyString,
() => MyString?.Length > 5));
}
}
}