.net 如何在WPF中创建两个相互排斥的复选框(但允许它们都被取消选中)

.net 如何在WPF中创建两个相互排斥的复选框(但允许它们都被取消选中),.net,wpf,.net,Wpf,我一直在努力使WPF中不可能同时选中两个复选框,但仍然允许同时选中这两个复选框 有人知道我怎样才能做到这一点吗 这就是我现在拥有的。不幸的是,当选中复选框时,这两个触发器都会被调用 <Window.Resources> <Style x:Key="style1" TargetType="{x:Type CheckBox}"> <Style.Triggers> <DataTrigger Binding="{B

我一直在努力使WPF中不可能同时选中两个复选框,但仍然允许同时选中这两个复选框

有人知道我怎样才能做到这一点吗

这就是我现在拥有的。不幸的是,当选中复选框时,这两个触发器都会被调用

<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; };