绑定DataTrigger时,不会检查WPF ToggleButton

时间:2014-03-07 16:50:38

标签: wpf xaml togglebutton

我试图让几个ToggleButton有点像单选按钮 - 但重要的区别是没有检查是有效的情况(只有最多一次可以检查一个,它们是互斥的。)

以下是一些几乎可行的XAML:

<Window>
    <Grid>
        <ToolBarTray DockPanel.Dock="Top">
            <ToolBar>
                <ToggleButton x:Name="ShowLineGridToggleButton">
                    <ToggleButton.Style>
                        <Style TargetType="ToggleButton">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding IsChecked, ElementName=ShowDotGridToggleButton}" Value="True">
                                    <Setter Property="IsChecked" Value="False" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </ToggleButton.Style>
                    <Image Source="../Images/ShowLineGrid.png" />
                </ToggleButton>
                <ToggleButton x:Name="ShowDotGridToggleButton">
                    <ToggleButton.Style>
                        <Style TargetType="ToggleButton">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding IsChecked, ElementName=ShowLineGridToggleButton}" Value="True">
                                    <Setter Property="IsChecked" Value="False" />
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </ToggleButton.Style>
                    <Image Source="../Images/ShowDotGrid.png" />
                </ToggleButton>
            </ToolBar>
        </ToolBarTray>
    <Grid>
</Window>

点击一个按钮确实会取消选中另一个按钮。不幸的是,发生的事情是点击的按钮没有被检查。当鼠标移过它时,背景会正确变化,但当鼠标移开时,按钮显示为未选中。

注释掉Setters可以检查点击的按钮。就像Setter也取消选中点击的按钮一样。

我宁愿在XAML中处理这个问题而不是诉诸于通过事件处理程序在代码中实现;这会将所有内容都定义在一个地方。

想法?

TIA!

1 个答案:

答案 0 :(得分:0)

尝试将ToggleButtons更改为RadioButtons。然后,您可以为每个模板应用ToggleButton模板,解决您的问题。

这应该为你编译:

<Window>

    <Window.Resources>
        <Style TargetType="{x:Type RadioButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <ToggleButton IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
                          Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <Grid>
        <ToolBarTray DockPanel.Dock="Top">
            <ToolBar>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <RadioButton x:Name="ShowLineGridToggleButton">
                        <Image Source="../Images/ShowLineGrid.png" />
                    </RadioButton>
                    <RadioButton Grid.Column="1" x:Name="ShowDotGridToggleButton">
                        <Image Source="../Images/ShowDotGrid.png" />
                    </RadioButton>
                </Grid>
            </ToolBar>
        </ToolBarTray>
    </Grid>
</Window>

正如您所看到的,您必须将单选按钮放在他们自己的列中,否则他们会对点击事件感到困惑。