wpf - 复选框数据触发器

标签 wpf

我有以下两个带有数据触发器的复选框。如果我单击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>

最佳答案

如果您的要求是允许用户取消选中这两个框,则您不能使用触发器以声明方式执行此操作,因为(我之前在评论中疯狂的胡言乱语相反),当触发器的条件停止时确实,它试图撤销之前所做的事情。

这是我对您所看到的内容的猜测:

  1. 用户检查 A。
  2. B 的触发器通过将 B 置于“未选中”状态来响应当前状态。
  3. 用户检查 B。
  4. A 的触发器通过将 A 置于“未选中”状态来响应当前状态。
  5. B 的触发器看到 A 的状态更改为“未选中”,并将 B 返回到其默认状态 - 未选中。
  6. 现在两者均未选中,用户可以随意选中其中任何一个,并且将保持这种状态。

如果按照 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/

相关文章:

c# - 如何在初始屏幕上报告将程序集加载到 .Net 中的当前 AppDomain 的进度?

c# - 什么会导致 WM_NCHITTEST lParam 溢出 32 位整数?

wpf - BackgroundWorker 和 WPF

c# - WPF 验证无需更新数据源

c# - 使多边形资源独一无二

c# - 带有滑入效果的WPF切换桌面

wpf - 在 Chromium 嵌入式框架中调试 JavaScript

wpf - 在 WPF 窗口的构造函数中,InitializeComponent() 之前应该做什么,之后应该做什么?

.net - 如何在 HierarchicalDataTemplate 的 DataType 属性中引用泛型类型?

c# - 如何将枚举绑定(bind)到 WPF 中的组合框控件?