这种行为对我来说似乎非常奇怪,我认为我做错了.我有一个ContentControl使用DataTemplete来呈现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>
Run Code Online (Sandbox Code Playgroud)
这不起作用......有点儿.
我已经在Visiblity和Margin上测试了这个(只是为了确定).除非在Image标记中定义了该属性,否则此触发器将更改属性.如果是,则触发器不会更新该属性.因此,如果我没有定义图像的可见性,并且触发器隐藏它,它就可以工作.问题是,默认值是Visible,触发器需要在value = 0时显示它,否则隐藏它.
为什么触发器不会覆盖显式定义的属性?这不是它的目的吗?
Cod*_*ked 22
这是正常的依赖属性值优先级.在Image上设置它是#3,而在Style触发器中它的优先级低于#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>
Run Code Online (Sandbox Code Playgroud)
除了触发器之外,还可以在样式中设置可见性
我曾经多次遇到DataTriggers这种奇怪的行为,有时DataTrigger Setters不会生效,除非Setter也在Style中定义.
不行
<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>
Run Code Online (Sandbox Code Playgroud)
将工作
<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>
Run Code Online (Sandbox Code Playgroud)
编辑:请参阅接受的答案,了解为什么这不起作用的解释.它与确定依赖项属性的顺序有关,其中定义的属性<Tag>始终优先于触发值.