【问题标题】:WPF Binding Two Checkboxes with IsChecked PropertyWPF 使用 IsChecked 属性绑定两个复选框
【发布时间】: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 中绑定)

标签: c# wpf checkbox


【解决方案1】:

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

IsChecked="{Binding IsSelected, Mode=TwoWay}"

如果你的虚拟机不是数据上下文,那么你将不得不遍历找到虚拟机,然后绑定到它

【讨论】:

    【解决方案2】:

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

    • 复选框 1:单击 => 通知已更改
    • 复选框 2:已更改 => 更新 => 通知已更改
    • 复选框 1:已更改 => 更新 => 通知已更改
    • ...

    【讨论】:

    • 如何在窗口中创建这样的属性?是否要在xaml文件中完成?
    • 您必须在实际类中创建属性。看看这个答案Two-way binding in WPF
    猜你喜欢
    • 1970-01-01
    • 2020-11-16
    • 2013-10-27
    • 2012-04-12
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2015-05-19
    相关资源
    最近更新 更多