IsChecked的触发器不触发



我想改变一个ToggleButton的图标(内容流畅的RibbonBar)取决于它的IsChecked属性。现在我已经编写了下面的样式片段:

<Fluent:ToggleButton.Style>
    <Style BasedOn="{StaticResource RibbonButtonStyle}" TargetType="{x:Type Fluent:ToggleButton}">
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding  RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Fluent:ToggleButton}}, Path=IsChecked}" Value="False">
                <Setter Property="Icon" Value="{StaticResource ResourceKey=Style.Images.Pined}"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding  RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Fluent:ToggleButton}}, Path=IsChecked}" Value="True">
                <Setter Property="Icon" Value="{StaticResource ResourceKey=Style.Images.Unpined}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Fluent:ToggleButton.Style>

问题是触发器不能很好地加载图像。问题不是,IsChecked没有实现它自己,我已经测试过了。我也没有在其他地方设置图标属性。如果我在其他地方使用图像资源,它们也可以正常工作。

信息重建:我已经把ToggleButton到后台作为一个RibbonListBox的DataTemplate放置在BackstageTabItem.

由于这是togglebutton的样式,因此不需要findancestor绑定-您将使用self。实际上,由于IsChecked是DP你可以使用触发器-例如<Trigger Property="IsChecked" Value="False">

绝对需要从控件声明中删除Icon属性,因为它将覆盖由于优先级而尝试做的所有样式。

但是那些DataTriggers将不起作用,绑定将寻找一个祖先,本身排除,所以你必须改变它们以及已经由AndrewS指出。只有满足这两个条件,你才有机会让它工作(甚至可能有额外的干扰)。

最新更新