Wpf 复选框数据触发器
我有下面两个带有datatriggers的复选框。如果我单击combo1,它将按预期取消选中combo2,但combo1在再次单击之前不会被选中。反过来也是一样的。为什么会这样Wpf 复选框数据触发器,wpf,Wpf,我有下面两个带有datatriggers的复选框。如果我单击combo1,它将按预期取消选中combo2,但combo1在再次单击之前不会被选中。反过来也是一样的。为什么会这样 <CheckBox Name="cbx1" VerticalAlignment="Center" Content="1"> <CheckBox.Style> <Style TargetType="CheckBox"> <Style.
<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>
您可以在两种样式中都添加一个setter,以确保至少有一个
复选框始终处于选中状态,如果这是您想要的:
<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>
如果您的要求是允许用户取消选中这两个框,那么您不能通过触发器声明性地执行此操作,因为(与我之前在评论中的疯狂胡言乱语相反),当触发器的条件不再为真时,它会尝试撤消以前执行的操作
以下是我对你所看到的情况的猜测:
用户检查A
B的触发器通过将B置于“未检查”状态来响应当前状态李>
用户检查B
A的触发器通过将A置于“未检查”状态来响应当前状态李>
B的触发器看到A的状态变为“未检查”,并将B返回到默认状态——未检查李>
现在,这两个选项都被取消选中,用户可以随意选中其中一个,并保持不变
如果按照mm8的建议将默认状态更改为True
,则无法同时取消选中这两种状态。如果将默认状态设置为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"
/>
您可以编写一个附加的行为属性来在XAML中进行设置
更新:您可以在纯XAML中使用DataTrigger执行此操作。Enteraction
和故事板:
<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>
@EdPlunkett检查1、2为假(B)。检查2,1为假(A),但2仍为假。我不明白为什么要点击两下…对不起,我应该试试这个代码。我不确定为什么这两个触发器最终会产生这种效果:我猜是这样的:1。检查A.2。B的触发器将B置于“未检查”状态。3.检查B.4。A的触发器将A置于“未检查”状态。5.B的触发器看到A的状态变为“未检查”,并将B返回到默认状态——未检查。6.现在两个都被取消选中,您可以随意检查其中一个,它将保持不变。这是一个猜测,但您的代码所做的与mm8修复它所做的是一致的。感谢您的分析。行为对我来说似乎有点奇怪,但我想我会用代码来处理它。谢谢你的帮助!我想它是可能的,没有复选框也活跃。还有?您不能至少检查一个,也不能没有人检查。这在理论上是不可能的。是的,绝对不可能。我要一个或两个都不要。您的解决方案总是一个活动的,就像一个单选按钮一样。@windowskm您必须使用事件来执行该操作。@windowskm查看我的更新答案--我找到了一种在纯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>