我有一个 DataTrigger 附加到 TextBlock 的样式,定义如下:

<DataTrigger Binding="{Binding Path=Link, Converter={StaticResource HasContentConverter}}" Value="True">
    <Setter Property="TextDecorations" Value="Underline" />
    <Setter Property="Cursor" Value="Hand" />
</DataTrigger>

我遇到的问题是我有多个对象最终使用这种样式,其中一些包含“链接”属性,而另一些则没有。每当系统遇到不存在的对象时,它就会在输出窗口中打印此错误:



这是预期的行为,但是我想知道是否有办法告诉 XAML 中的处理器仅在“链接”属性存在时才应用(即,在尝试绑定(bind)之前检查该属性,或者其他一些不存在的方法)打印错误)。这可能吗?

最佳答案

开箱即用和直接使用都是不可能的。

不是开箱即用的:您可以编写自己的 BindingExtension,其行为如下:如果 Prop 存在则绑定(bind),否则忽略。你也可以,khem,关闭报告绑定(bind)错误,但当然这通常是不想要的。

不直接:您可以创建某种类型的附加属性,然后设置此类属性而不是设置绑定(bind)。您的属性 setter 将附加到 datacontext-changes 并在它们飞来飞去时检查对象和可视组件并设置绑定(bind)与否。

不直接#2:您可以尝试“分层”样式和触发器。如您所知,触发器有一个条件。将您的样式分为两部分:第一部分是不需要“保护”的通用样式,第二部分包含依赖于“Blargh”属性的功能。将第一个样式设置为默认/正常。现在创建一个名为“DefinesBlargh”或“HasBlarghDefines”的只读附加属性,用于检查目标对象的数据上下文是否确实具有这样的属性。现在向第一个样式添加一个触发器,用于检测样式控件是否具有“HasBlarghDefined”等于“true”,并且在触发器的操作中...

……问题来了。在那里做什么?您不能再次将样式替换为样式的第二部分,因为它可能会移除触发器并反过来停用逻辑(这将是一次性的)。或者,它可能只是由于尝试在一次更新扫描中两次更改样式而崩溃。我实际上不知道会发生什么,但我感觉到了“气味”。更重要的是,更改到第二部分只会删除第一部分设置的常见内容。

因此,如果它确实会运行并替换样式,则必须确保保留原始触发逻辑和第一个样式的其余部分,我建议使用“样式继承”,即基于样式property: http://wpftutorial.net/StyleInheritance.html 也就是说,不要创建两个单独的部分,而是将所有常见的东西制作一个“基础部分”,以及一个“专业部分”, 是基于 的第一个,并添加了不安全的额外内容。现在动态地重新替换为专门的对应物更合理一些。

或者,如果您对布局有一定的控制权,您可以变得聪明:为什么将两种样式应用于同一个组件?在控件的某个外部边界上设置通用样式并将额外的触发器放在那里,让触发器将小的不安全的第二样式应用于控件。

如果您真的必须使用样式的两个部分精确定位一个控件并且不能使用“基于”或者如果它根本不起作用等,您可以做另一个聪明的技巧:使用允许您定义样式的 MultiStyle将两个/三个/+其他样式合并为一个,然后构建触发器层次结构如下:

multitrigger
   condition: HasBlarghDefined = TRUE
   condition: your own data condition
   setter: set style = multistyle of "generalpart" and "usnafepart"
multitrigger
   condition: HasBlarghDefined = FALSE
   condition: your own data condition
   setter: set style = just a generalpart

恕我直言,这只是必须工作。

编辑:忘记通过关键链接:The MultiStyle

关于wpf - XAML "Conditional"绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11940905/

10-11 05:59
查看更多