View Model命令中的BindingExpression Path错误

时间:2013-09-23 20:23:47

标签: c# wpf mvvm command

我的视图模型中的命令遇到了问题,这些命令绑定到我的WPF应用程序中的用户控件。当用户选中或取消选中checkBox时,将运行这些命令。话虽这么说,命令显然已经绑定到checkBoxes

运行程序后,我的输出窗口对每个命令都有以下错误(请注意,在检查或取消选中checkBoxes时,命令在运行时不起作用):

System.Windows.Data Error: 40 : BindingExpression path error: 'MyCommand' property not found on 'object' 'ViewModel' (HashCode=3383440)'. BindingExpression:Path=MyCommand; DataItem='ViewModel' (HashCode=3383440); target element is 'CheckBox' (Name='checkBox1'); target property is 'Command' (type 'ICommand')

这就是我的XAML的样子:

<CheckBox Content="CheckBox" Command="{Binding MyCommand}" .../>

我的View模型中的C#代码:

private Command _myCommand;

public Command MyCommand { get { return _myCommand; } }
private void MyCommand_C()
{
    //This is an example of how my commands interact with my model
    _dataModel._groupBoxEnabled = true;
}

内部构造函数:

_myCommand = new Command(MyCommand_C);

1 个答案:

答案 0 :(得分:3)

您需要将视图模型分配给View的DataContext。您的* .xaml.cs中有哪些代码?应该是这样的:

public MyView( )
{
    this.DataContext = new ViewModel( );
}

将来,您可以告诉您的视图模型没有被输出中的信息连接起来:

  

System.Windows.Data错误:40:BindingExpression路径错误:   在'对象''ViewModel'上找不到'MyCommand'属性   (的HashCode = 3383440)”。 BindingExpression:路径= mycommand的;   DataItem ='ViewModel'(HashCode = 3383440);目标元素是'CheckBox'   (名称= 'checkBox1'); target属性是'Command'(类型'ICommand')

它所讨论的对象是DataContext,如果它显示为'object'类型,它不是'ViewModel'类型,这意味着你还没有将它分配给DataContext

回答有关与数据交互的评论中的问题:

命令允许您进一步将逻辑与UI分开,这很棒。但在某些时候,您可能希望从ViewModel回访UI。为此,您需要使用notify the UI of when they are changed的属性。因此,在您的命令中,您可以在ViewModel(比如IsChecked)上为CheckBox的Checked属性绑定一个属性。所以你的Xaml看起来像:

<CheckBox Content="CheckBox" Checked="{Binding IsChecked}" Command="{Binding MyCommand}" .../>

您的ViewModel可能如下所示:

private Command _myCommand;
private bool _isChecked;

public Command MyCommand { get { return _myCommand; } }
public bool IsChecked
{
    /* look at the article to see how to use getters and setters */
}

private void MyCommand_C()
{
    IsChecked = !IsChecked;
    _dataModel._groupBoxEnabled = IsChecked;
}

如果要将属性包装在已经是视图模型属性的对象上,只需使用(我称之为)包装器属性。

public bool IsChecked
{
    get
    {
        return _dataModel.MyCheckBox;
    }
    set
    {
        if(_dataModel != null)
        {
            _dataModel.MyCheckBox = value;
            OnPropertyChanged("IsChecked");
        }
        // Exception handling if _dataModel is null
    }
}