下面有两个带有数据人的复选框。如果我单击combo1,它将按预期取消对combo2的检查,但在再次单击它之前,combo1不会被选中。相反的情况是一样的。为什么会这样呢?
<CheckBox Name="cbx1" VerticalAlignment="Center" Content="1">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, ElementName=cbx2}" Value="True">
<Setter Property="IsChecked" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
<CheckBox Name="cbx2" VerticalAlignment="Center" Content="2">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, ElementName=cbx1}" Value="True">
<Setter Property="IsChecked" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>发布于 2017-08-31 16:39:21
如果您的要求是允许用户取消这两个复选框,则不能使用触发器进行声明性操作,因为(与我先前的注释中的疯狂言论相反),当触发器的条件不再为真时,它试图撤消它以前所做的事情。
我猜你看到的是什么:
如果按照True的建议将默认状态更改为mm8,那么就无法使这两种状态都不受检查。如果将默认状态设置为False,那么要检查任何内容都是很困难的。
但这样做是可行的:
<CheckBox
Name="cbx1"
Content="1"
Tag="{Binding ElementName=cbx2}"
Checked="twinnedCheckBox_Checked"
/>
<CheckBox
Name="cbx2"
Content="2"
Tag="{Binding ElementName=cbx1}"
Checked="twinnedCheckBox_Checked"
/>代码背后:
private void twinnedCheckBox_Checked(object sender, RoutedEventArgs e)
{
var self = sender as CheckBox;
var twin = self.Tag as CheckBox;
if ((bool)twin.IsChecked)
twin.IsChecked = false;
}您可以编写附加的行为属性,以便在XAML中设置此孪生行为。
更新:您可以使用DataTrigger.EnterActions和故事板在纯XAML中完成此操作:
<CheckBox Name="cb3" VerticalAlignment="Center" Content="3">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Setter Property="IsChecked" Value="False"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, ElementName=cb4}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames
Storyboard.TargetProperty="IsChecked"
>
<DiscreteBooleanKeyFrame KeyTime="0" Value="False" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
<CheckBox Name="cb4" VerticalAlignment="Center" Content="4">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Setter Property="IsChecked" Value="False"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, ElementName=cb3}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames
Storyboard.TargetProperty="IsChecked"
>
<DiscreteBooleanKeyFrame KeyTime="0" Value="False" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>发布于 2017-08-31 15:40:24
您可以在这两种样式中添加一个setter,以确保始终检查至少一个CheckBox,如果是这样的话:
<CheckBox Name="cbx1" VerticalAlignment="Center" Content="1">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Setter Property="IsChecked" Value="True"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, ElementName=cbx2}" Value="True">
<Setter Property="IsChecked" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
<CheckBox Name="cbx2" VerticalAlignment="Center" Content="2">
<CheckBox.Style>
<Style TargetType="CheckBox">
<Setter Property="IsChecked" Value="True"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked, ElementName=cbx1}" Value="True">
<Setter Property="IsChecked" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>https://stackoverflow.com/questions/45985178
复制相似问题