【发布时间】:2015-03-28 11:26:12
【问题描述】:
我有一个 WPF UI,包含以下元素:
- 选中的复选框位于 DataGridRow 中。
- 其余部分位于 DataGridRowDetails 中。 (它包含一个较小的 DataGrid)
我要做的是将两个(红色箭头所示)复选框绑定在一起,这样当一个被选中时,另一个也被选中,反之亦然。
我已经看过这些问题了:
1) WPF Binding with 2 Checkboxes
但是当我尝试这个时,点击处理程序停止工作。 (复选框完全停止工作)
2)wpf bindings between two checkboxes
当我使用触发器时,一个复选框触发另一个复选框,然后它又触发另一个,然后继续。UI 卡住了。
我的代码示例:
<DataGrid x:Name="DataGrid1">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox x:Name="SelectionCheckBox1" PreviewMouseLeftButtonDown="SelectionCheckBox1_PreviewMouseLeftButtonDown"
Loaded="SelectionCheckBox1_Loaded"
IsChecked="{Binding ElementName=HeaderCheckBox1, Path=IsChecked, Mode=TwoWay}">
</CheckBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DockPanel LastChildFill="True">
<DataGrid>
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<CheckBox x:Name="HeaderCheckBox1" PreviewMouseLeftButtonDown="HeaderCheckBox_PreviewMouseLeftButtonDown"
IsChecked="{Binding ElementName=SelectionCheckBox1, Path=IsChecked, Mode=TwoWay}">
</CheckBox>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
</DataGrid.Columns>
</DataGridTemplateColumn>
</DataGrid>
</DockPanel>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
关注:因为第二个复选框仅在选中行后出现(这意味着另一个复选框被选中),我也无法通过 VisualTreeHelpers 找到第二个复选框。
我们将不胜感激一些想法,甚至导致可能的解决方案。
【问题讨论】:
-
使用 mvvm 模式并将它们绑定到实现 iNotifyPropertyChanged 的布尔属性将对您有很大帮助。
-
@mcy,我收到一条错误消息,提示“在类型 'CheckBox' 中找不到绑定属性”事实上,我有一个 MVVM 设置,并且模型中有一个 'IsSelected' 属性。但是使用复选框,我无法找到如何做到这一点。
-
我明白了。正如 Muds 的回答一样,(如果您的 VM 的布尔属性是 isSelected),您应该使用 IsChecked="{Binding IsSelected, Mode=TwoWay}" 以及在代码隐藏中设置 this.DataContext = yourVMInstance (或在 XAML 中绑定)