.net 如何在WPF中创建两个相互排斥的复选框(但允许它们都被取消选中)
我一直在努力使WPF中不可能同时选中两个复选框,但仍然允许同时选中这两个复选框 有人知道我怎样才能做到这一点吗 这就是我现在拥有的。不幸的是,当选中复选框时,这两个触发器都会被调用.net 如何在WPF中创建两个相互排斥的复选框(但允许它们都被取消选中),.net,wpf,.net,Wpf,我一直在努力使WPF中不可能同时选中两个复选框,但仍然允许同时选中这两个复选框 有人知道我怎样才能做到这一点吗 这就是我现在拥有的。不幸的是,当选中复选框时,这两个触发器都会被调用 <Window.Resources> <Style x:Key="style1" TargetType="{x:Type CheckBox}"> <Style.Triggers> <DataTrigger Binding="{B
<Window.Resources>
<Style x:Key="style1" TargetType="{x:Type CheckBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=checkBox2, Path=IsChecked}" Value="True">
<Setter Property="CheckBox.IsChecked" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="style2" TargetType="{x:Type CheckBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=checkBox1, Path=IsChecked}" Value="True">
<Setter Property="CheckBox.IsChecked" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<CheckBox Style="{StaticResource style1}" Name="checkBox1" Content="Check Box 1" />
<CheckBox Style="{StaticResource style2}" Name="checkBox2" Content="Check Box 2" />
</Grid>
利用
列表框
的独家单键选择模式
来实现此
<ListBox x:name="MyListBox"
xmlns:System="clr-namespace:System;assembly=mscorlib"
SelectionMode="Single">
<ListBox.Resources>
<Style TargetType="{x:Type ListBoxItem}">
<Style.Resources>
<SolidColorBrush
x:Key="{x:Static SystemColors.HighlightBrushKey}"
Color="Transparent"/>
</Style.Resources>
</Style>
</ListBox.Resources>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel IsItemsHost="True"
Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox
Content="{Binding}"
IsChecked="{Binding
IsSelected,
RelativeSource={RelativeSource
AncestorType={x:Type ListBoxItem}},
Mode=TwoWay}"
Margin="5"/>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsSource>
<x:Array Type="{x:Type System:String}">
<System:String>My Checkbox 1</System:String>
<System:String>My Checkbox 2</System:String>
</x:Array>
</ListBox.ItemsSource>
</ListBox>
我的复选框1
我的复选框2
因此,对于“n”互斥复选框,只需将大量字符串添加到上面的x:Array
。上述功能对RadioBox也非常有用
正如您所说的,复选框将不允许任何复选框或只允许一个复选框。然后要访问实际选中的复选框,
MyListBox.SelectedIndex
将对您有所帮助。与其使用复选框,不如重新设置单选按钮的样式
<Style TargetType="{x:Type RadioButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type RadioButton}">
<CheckBox x:Name="Checkbox" IsChecked="{Binding Path=IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWayToSource}"
Content="{Binding Path=Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" />
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsChecked, RelativeSource={RelativeSource TemplatedParent}}" Value="{x:Null}">
<Setter TargetName="Checkbox" Property="IsChecked" Value="False"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsChecked, RelativeSource={RelativeSource TemplatedParent}}" Value="False">
<Setter TargetName="Checkbox" Property="IsChecked" Value="False"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsChecked, RelativeSource={RelativeSource TemplatedParent}}" Value="True">
<Setter TargetName="Checkbox" Property="IsChecked" Value="True"/>
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
要允许两者都被取消选中,请创建一个触发器来处理{x:Null}
值。我已经实现了这样一个触发器,但是还没有测试它是否能工作(如果您有问题,请告诉我)。您可以使用两行C代码达到预期效果:
CheckBox1.Checked += (sender, e) => { CheckBox2.IsChecked = false; };
CheckBox2.Checked += (sender, e) => { CheckBox1.IsChecked = false; };