首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CheckBox DataTriggers

CheckBox DataTriggers
EN

Stack Overflow用户
提问于 2017-08-31 15:30:15
回答 2查看 128关注 0票数 2

下面有两个带有数据人的复选框。如果我单击combo1,它将按预期取消对combo2的检查,但在再次单击它之前,combo1不会被选中。相反的情况是一样的。为什么会这样呢?

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-31 16:39:21

如果您的要求是允许用户取消这两个复选框,则不能使用触发器进行声明性操作,因为(与我先前的注释中的疯狂言论相反),当触发器的条件不再为真时,它试图撤消它以前所做的事情。

我猜你看到的是什么:

  1. 用户检查A。
  2. B的触发器通过将B置于“未检查”状态来响应当前状态。
  3. 用户检查B
  4. A的触发器通过将A置于“未检查”状态来响应当前状态。
  5. B的触发器看到A的状态改变为“未检查”,并返回B到它的默认状态-未检查。
  6. 现在这两种情况都没有被检查过,用户可以随意检查其中一种,这样就可以保持这种状态了。

如果按照True的建议将默认状态更改为mm8,那么就无法使这两种状态都不受检查。如果将默认状态设置为False,那么要检查任何内容都是很困难的。

但这样做是可行的:

代码语言:javascript
复制
<CheckBox 
    Name="cbx1" 
    Content="1"
    Tag="{Binding ElementName=cbx2}"
    Checked="twinnedCheckBox_Checked"
    />
<CheckBox 
    Name="cbx2" 
    Content="2"
    Tag="{Binding ElementName=cbx1}"
    Checked="twinnedCheckBox_Checked"
    />

代码背后:

代码语言:javascript
复制
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中完成此操作:

代码语言:javascript
复制
<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>
票数 2
EN

Stack Overflow用户

发布于 2017-08-31 15:40:24

您可以在这两种样式中添加一个setter,以确保始终检查至少一个CheckBox,如果是这样的话:

代码语言:javascript
复制
<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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45985178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档