WPF:选中一个复选框时取消选择我的所有复选框
WPF: Deselect all my Checkbox when one is selected
这是我的第一个 ListView row column
包含 CheckBox
:
<GridViewColumn Width="40" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox Name="cbSelectInterface" IsThreeState="False" ></CheckBox>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
我如何添加选项以仅检查特定 Row
中的一个 CheckBox
而我选择另一个 CheckBox
并检查此控件所有其他 CheckBox
变为非已选择?
如何将 CheckBox 的 IsChecked 属性 绑定到 ListViewItem 的 IsSelected 属性?如果 SelectionMode 设置为 Single,那么您将只能 select 一行和一个复选框。
<ListView ItemsSource="{Binding Source={StaticResource TestDataSource}}"
SelectionMode="Single">
<ListView.View>
<GridView>
<GridViewColumn Width="30">
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsSelected,
RelativeSource={RelativeSource
AncestorType={x:Type ListViewItem}}}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding}" />
</GridView>
</ListView.View>
</ListView>
然后您可以使用 ListView 的 SelectedItem
来了解哪一行是带有选中复选框的行。
在 WPF 中,没有自动执行您想要的操作的控件。但是,如果您按照 WPF 应用程序中的习惯使用数据绑定,那么实现您的要求很简单,或者至少会很简单。在这种情况下,您的视图模型或隐藏代码将有一个包含所有数据项的对象(即绑定到 ListView.ItemsSource
属性 的数据)。
当 Checkbox
中的一个被选中时,您需要做的就是遍历数据绑定集合中的每个项目,并将它们的数据绑定到 Checkbox
的属性设置为 false
:
foreach (var item in YourDataBoundCollection)
{
item.PropertyDataBoundToCheckBox = false;
}
如果您已经按照应有的方式在数据 class 上实现了 INotifyPropertyChanged
接口,那么 UI 将自动更新。
剩下的唯一问题是您如何知道 CheckBox
何时被检查?最简单的 'non MVVM' 方法是为 CheckBox.Checked
Event.
添加处理程序
这是我的第一个 ListView row column
包含 CheckBox
:
<GridViewColumn Width="40" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox Name="cbSelectInterface" IsThreeState="False" ></CheckBox>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
我如何添加选项以仅检查特定 Row
中的一个 CheckBox
而我选择另一个 CheckBox
并检查此控件所有其他 CheckBox
变为非已选择?
如何将 CheckBox 的 IsChecked 属性 绑定到 ListViewItem 的 IsSelected 属性?如果 SelectionMode 设置为 Single,那么您将只能 select 一行和一个复选框。
<ListView ItemsSource="{Binding Source={StaticResource TestDataSource}}"
SelectionMode="Single">
<ListView.View>
<GridView>
<GridViewColumn Width="30">
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsSelected,
RelativeSource={RelativeSource
AncestorType={x:Type ListViewItem}}}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding}" />
</GridView>
</ListView.View>
</ListView>
然后您可以使用 ListView 的 SelectedItem
来了解哪一行是带有选中复选框的行。
在 WPF 中,没有自动执行您想要的操作的控件。但是,如果您按照 WPF 应用程序中的习惯使用数据绑定,那么实现您的要求很简单,或者至少会很简单。在这种情况下,您的视图模型或隐藏代码将有一个包含所有数据项的对象(即绑定到 ListView.ItemsSource
属性 的数据)。
当 Checkbox
中的一个被选中时,您需要做的就是遍历数据绑定集合中的每个项目,并将它们的数据绑定到 Checkbox
的属性设置为 false
:
foreach (var item in YourDataBoundCollection)
{
item.PropertyDataBoundToCheckBox = false;
}
如果您已经按照应有的方式在数据 class 上实现了 INotifyPropertyChanged
接口,那么 UI 将自动更新。
剩下的唯一问题是您如何知道 CheckBox
何时被检查?最简单的 'non MVVM' 方法是为 CheckBox.Checked
Event.