Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 复选框数据触发器_Wpf - Fatal编程技术网

Wpf 复选框数据触发器

Wpf 复选框数据触发器,wpf,Wpf,我有下面两个带有datatriggers的复选框。如果我单击combo1,它将按预期取消选中combo2,但combo1在再次单击之前不会被选中。反过来也是一样的。为什么会这样 <CheckBox Name="cbx1" VerticalAlignment="Center" Content="1"> <CheckBox.Style> <Style TargetType="CheckBox"> <Style.

我有下面两个带有datatriggers的复选框。如果我单击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>

您可以在两种样式中都添加一个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>