首页 > 解决方案 > 绑定到 Checkbox 的检查命令时出现 BindingExpression 路径错误

问题描述

我有DataGrid一列复选框,我在DataGrid标题中有一个复选框,选中时会选中所有复选框。基于这个答案,我有一个绑定到“已检查”事件的命令和另一个绑定到“未检查”事件的命令。

所有相关文件都在下面(当然是简化的)

我的 XAML:

<DataGridTemplateColumn Width="40">
    <DataGridTemplateColumn.Header>
        <CheckBox>
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Checked">
                    <i:InvokeCommandAction Command="{Binding CheckAllRowsCommand}"/>
                </i:EventTrigger>
                <i:EventTrigger EventName="Unchecked">
                    <i:InvokeCommandAction Command="{Binding UncheckAllRowsCommand}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </CheckBox>
    </DataGridTemplateColumn.Header>

    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding Selected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>

</DataGridTemplateColumn>

我的xml.cs

public partial class MyTableView: UserControl
{
    public MyTableView()
    {
        InitializeComponent();
        DataContext = new MyTableViewModel();
    }
}

MyTableViewModel.cs

public class MyTableViewModel: BaseViewModel
{
    public MyTableViewModel() : base()
    {
        CheckAllRowsCommand= new CheckAllRowsCommand(this);
        UncheckAllRowsCommand = new UncheckAllRowsCommand(this);
    }

    public ICommand CheckAllRowsCommand{ get; }
    public ICommand UncheckAllRowsCommand{ get; }
}

CheckAllRows 命令

public class CheckAllRowsCommand: BaseCommand
{
    public CheckAllRowsCommand(MyTableViewModel parent) : base(parent)
    {
    }

    public override bool CanExecute(object parameter)
    {
        return true;
    }

    public override void Execute(object parameter)
    {
       // Set the Selected property of each data row
    }
}

运行此程序时,我收到以下错误:

System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“CheckBox”(名称=“”)上找不到“CheckAllRowsCommand”属性。绑定表达式:路径=CheckAllRowsCommand;DataItem='CheckBox' (Name=''); 目标元素是“InvokeCommandAction”(HashCode=47015983);目标属性是“命令”(类型“ICommand”)

任何帮助将不胜感激。

标签: c#wpfxamldata-binding

解决方案


在我看来,这是一个比 ASh 发布的更详细的解决方案,但更灵活。

<CheckBox DataContext="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}">
...
</CheckBox>

问题是模板中的绑定似乎使用的CheckBox是数据上下文,而您认为它会使用包含控件的数据上下文。WPF 有时可能很时髦,任何时候我看到这样的错误(即BindingExpression path error: 'blah' property not found on 'object' ''blah')我总是假设数据上下文没有被正确推断。

我提出的解决方法是CheckBox使用相对源强制设置数据上下文。例如,相对源可用于声明性地说“使用此类型的第一个父级”。这个绑定是说“将我的 DataContext 属性设置为我DataContext上面的第一个父类型DataGrid”。从逻辑上讲,该类型复选框的第一个父级DataGrid将是您想要的那个。然后你的内部命令绑定不需要改变,一切都应该按预期工作。


推荐阅读