【问题标题】:How can set property in trigger, if it's null?如果它为空,如何在触发器中设置属性?
【发布时间】:2011-07-14 18:05:20
【问题描述】:

如何在触发器中设置属性,如果它是空的?

<Style.Triggers>
    <Trigger Property="ContextMenu" Value="{x:Null}">
        <Setter Property="ContextMenu" Value="{DynamicResource ContextMenu}"/>
     </Trigger>
</Style.Triggers>

【问题讨论】:

  • 您是否尝试设置 ContextMenu,仅在用户未设置的情况下?
  • 是的,我正在尝试设置 ContextMenu,但前提是用户没有设置它。

标签: wpf triggers null properties


【解决方案1】:

您可以像这样直接在 Style 中设置 ContextMenu:

<Style ...>
    <Setter Property="ContextMenu" Value="{DynamicResource ContextMenu}"/>
</Style>

如果用户明确设置 ContextMenu,那么它将优先于 Style 设置器。请参阅此MSDN article 了解顺序或优先级。您的样式设置器位于 #8 之下,而用户设置位于 #3。

【讨论】:

    【解决方案2】:

    你试过了吗?

    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=ContextMenu}" Value="{x:Null}">
            <Setter Property="ContextMenu" Value="{DynamicResource ContextMenu}"/>
         </DataTrigger>
    </Style.Triggers>
    

    但实际上您应该在控件样式中设置上下文菜单,然后控件的任何用户都可以在派生样式或控件属性中覆盖它。

    【讨论】:

    • 我试过了。看到这个问题:link
    • 对不起,您能详细说明一下吗?在示例中,您链接到的问题是关于基于基本样式的样式。这对你有用吗?在这个问题上,我认为更多的是风格触发器的问题。感谢您的支持,但我想知道该解决方案是否有用。
    • 这个解决方案会产生 StackOverflow 异常。
    • 听起来您的 DynamicResource 为空。另一种方法是按照您的风格设置上下文菜单。挂钩基础依赖属性的 changed 事件,然后如果它被更改为 null ,则将其强制到您的资源。
    • 你的触发器不好。当 ContextMenu 为 null 时,Setter 会将其设置为非 null 值,这会使触发器无效,从而将 Setter 还原,从而导致 ContextMenu 再次为 null,等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2013-04-09
    • 2013-08-30
    • 2022-01-03
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多