繁体   English   中英

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

[英]Using RelayCommand in MVVM Light with a CanExecute delegate causes my application not to launch

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

您的视图模型中的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));
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM