WPF绑定带有IsChecked属性的两个复选框

时间:2015-01-29 09:37:52

标签: c# wpf checkbox

我有一个WPF UI,包含以下元素:

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找到第二个复选框。

一些想法甚至可能导致一个可能的解决方案将非常感激。

2 个答案:

答案 0 :(得分:0)

我建议2将它们绑定到一个他们都可以访问的属性(例如窗口内的某个地方),因为使用解决方案1,你创建了一个无限循环

  • 复选框1:点击=&gt;通知已更改
  • 复选框2:已更改=&gt; update =&gt;通知已更改
  • 复选框1:已更改=&gt; update =&gt;通知已更改
  • ...

答案 1 :(得分:0)

您需要在ViewModel中创建一个属性,称该属性名为IsSelected,然后您必须将这些复选框绑定到该属性。它应该将dataContext作为您的视图模型,而不是元素。

IsChecked =&#34; {Binding IsSelected,Mode = TwoWay}&#34;

如果您的VM不是数据上下文,那么您必须遍历以查找VM然后绑定到它