使用带有CanExecute委托的MVVM Light中的RelayCommand导致我的应用程序无法启动

时间:2016-06-17 19:34:11

标签: c# wpf mvvm

我无法从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参数会破坏我的应用程序?

1 个答案:

答案 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));
        }
    }
}