视图模型命令中的绑定表达式路径错误

本文关键字:表达式 路径 错误 绑定 模型 命令 视图 | 更新日期: 2023-09-27 18:32:25

我在将视图模型中的命令绑定到 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}" .../>

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

视图模型命令中的绑定表达式路径错误

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

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

将来,您可以判断视图模型未被输出中的信息挂钩:

System.Windows.Data 错误: 40 : 绑定表达式路径错误: 在"对象"视图模型"上找不到"我的命令"属性 (哈希代码=3383440)'。BindingExpression:Path=MyCommand; DataItem='ViewModel' (HashCode=3383440);目标元素是"复选框" (名称='复选框1');目标属性为"命令"(类型为"ICommand")

它所谈论的对象是 DataContext,如果它显示为类型"对象",则它不是"ViewModel"类型,这意味着您尚未将其分配给 DataContext。

要回答注释中有关与数据交互的问题,请执行以下操作:

命令允许您进一步将逻辑与 UI 分离,这很棒。但在某些时候,您可能希望从 ViewModel 与 UI 对话。为此,需要使用可以在更改时通知 UI 的属性。因此,在您的命令中,您可以在 ViewModel(例如 IsChecked)上设置一个属性,复选框的 Checked 属性绑定到该属性。所以你的 Xaml 看起来像:

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

您的视图模型可能如下所示:

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
    }
}