c# - 绑定到 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”)
任何帮助将不胜感激。
解决方案
在我看来,这是一个比 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
将是您想要的那个。然后你的内部命令绑定不需要改变,一切都应该按预期工作。
推荐阅读
- python - 在另一个带有 args 的 ODE 中使用 ODE 会使代码非常慢
- jquery - 了解 javascript 中的作用域和 jquery 链接
- html - NVDA 未在 div 上读取 aria-label
- swift - 如何使用 Swift KeyPaths 的异构数组
- powershell - Powershell将文件从环境变量复制到另一个环境变量的zip文件夹
- python - 如何在创建父级时清除内部类属性
- r - 将列拆分为行,并更改 R 中新行的特定列值
- c# - OpenPop.Pop3.Exceptions.InvalidLoginException:“服务器不接受用户凭据”
- php - 更新列值 laravel
- reactjs - 错误:在 com.android.build.gradle.internal.api.ApplicationVariantImpl 类型的对象上找不到参数 [] 的方法 getCompileConfiguration()