gpt4 book ai didi

c# - View 模型命令中的 BindingExpression 路径错误

转载 作者:行者123 更新时间:2023-12-03 10:59:42 25 4
gpt4 key购买 nike

我的 View 模型中的命令绑定(bind)到我的 WPF 应用程序中的用户控件时遇到问题。这些命令在用户选中或取消选中 checkBox 时运行。话虽如此,这些命令显然绑定(bind)到 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);

最佳答案

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

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

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

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')



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

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

命令允许您进一步将逻辑与 UI 分开,这很棒。但在某些时候,您可能想从 ViewModel 与 UI 对话。为此,您需要使用可以 notify the UI of when they are changed 的属性。 .因此,在您的命令中,您可以在 CheckBox 的 Checked 属性绑定(bind)到的 ViewModel 上设置一个属性(比如 IsChecked)。所以你的 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;
}

如果你想在一个已经是 View 模型属性的对象上包装一个属性,只需使用(我称之为)包装器属性。
public bool IsChecked
{
get
{
return _dataModel.MyCheckBox;
}
set
{
if(_dataModel != null)
{
_dataModel.MyCheckBox = value;
OnPropertyChanged("IsChecked");
}
// Exception handling if _dataModel is null
}
}

关于c# - View 模型命令中的 BindingExpression 路径错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18968163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com