我有以下两个带有数据触发器的复选框。如果我单击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>
最佳答案
如果您的要求是允许用户取消选中这两个框,则您不能使用触发器以声明方式执行此操作,因为(与我之前在评论中疯狂的胡言乱语相反),当触发器的条件停止时确实,它试图撤销之前所做的事情。
这是我对您所看到的内容的猜测:
- 用户检查 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"
/>
隐藏代码:
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;
}
您可以简单地编写一个附加的行为属性来设置此 twin behavior在 XAML 中。
更新:您可以使用 DataTrigger.EnterActions
和 Storyboard 在纯 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>
关于wpf - 复选框数据触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45985178/