WPF触发器无法设置元素属性,如果在元素中设置了该属性

14

这种行为对我来说似乎非常奇怪,我认为我可能做错了什么。我有一个ContentControl,使用一个DataTemplate来呈现一个TabControl。我希望在没有标签页打开时显示一张图片,当有标签页打开时隐藏它。但问题在于:

<Image Name="image1" Stretch="Uniform" Visibility="Hidden" Source="/Affinity;component/Images/affinity_logo.png">
            <Image.Style>
                <Style TargetType="Image">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Items.Count, ElementName=tabcontrolworkspaces}"
                        Value="0">
                            <Setter Property="Visibility" Value="Visible" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Image.Style>
        </Image>

这不起作用...有点问题。

我已经在可见性和边距上测试过这个触发器(只是为了确保)。这个触发器将更改属性,除非该属性在Image标记中定义。如果它是定义过的,触发器就不会更新该属性。因此,如果我没有为图像定义可见性,并且触发器隐藏了它,它就起作用了。问题是,默认值是可见的,而当value=0时触发器需要显示它,否则需要隐藏。

为什么触发器不能覆盖明确定义的属性?这不是它的目的吗?


这个回答解决了您的问题吗?DataTrigger 没有触发 - Peter Duniho
3个回答

27

这是普通的依赖属性值优先级。在Image上设置它是#3,而在样式触发器中的优先级较低,为#6。

你可以这样做:

<Image Name="image1" Stretch="Uniform" Source="/Affinity;component/Images/affinity_logo.png">
    <Image.Style>
        <Style TargetType="Image">
            <Setter Property="Visibility" Value="Hidden" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Items.Count, ElementName=tabcontrolworkspaces}"
                    Value="0">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Image.Style>
</Image>

9

在样式和触发器中都设置可见性

我遇到过很多次DataTrigger的奇怪行为,有时候如果Setter没有在样式中定义,它就不会生效。

无法工作

<Image Visibility="Collapsed">
    <Image.Style>
        <Style TargetType="Image">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Something}" Value="0">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    <Image.Style>
</Image>

会工作

<Image>
    <Image.Style>
        <Style TargetType="Image">
            <Setter Property="Visibility" Value="Collapsed" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Something}" Value="0">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    <Image.Style>
</Image>
编辑:请查看被接受的答案,了解为什么这不起作用。这与确定依赖属性的顺序有关,在其中在<Tag>中定义的属性始终优先于触发的值。

-1

当触发器为真时,它将把值更改为所需的值。当它不再为真时,它将返回值到先前的值。它不会将其更改为不想要的值。

这意味着如果原始值是可见的,并且您将其更改为可见,当触发器不再处于活动状态时,该值将恢复为可见。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接