wpf - XAML "Conditional"绑定(bind)

标签 wpf xaml binding conditional-statements

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

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

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

BindingExpression path error: 'Link' property not found on 'object' ''DataRowView' (HashCode=53681904)'. BindingExpression:Path=Link; DataItem='DataRowView' (HashCode=53681904); target element is 'TextBlock' (Name=''); target property is 'NoTarget' (type 'Object')

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

最佳答案

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

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

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

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

...这就是问题所在。在那里可以做什么?您无法再次将样式替换为样式的第二部分,因为它可能会删除触发器并进而停用逻辑(这将是一次性的)。或者,由于尝试在一次更新扫描中两次更改样式,它可能会崩溃。我其实不知道会发生什么,但我感觉到“一股味道”。此外,更改为第二部分只会删除第一部分设置的常见内容。

因此,如果它实际上要运行并替换样式,您必须确保保留原始触发逻辑和第一个样式的其余部分,我建议使用“样式继承”,即基于-on 样式属性: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/

相关文章:

c# - 如何使用 MVVM 模式实现进度条

c# - 按列分组以计算 LINQ WPF 中另一列的重复值

javascript - 我怎样才能用 jQuery 实现这个交互模型呢?

c# - 使用图像+文本样式化 WPF 按钮

.net - 如何将此 StackPanel 用作资源

c# - 触发其他控制事件时触发控制事件

c# - FlipView.SelectedIndex 鼠标模式与基本触摸模式

xaml - 管理外部同事编写的帮助内容的工作流程

WPF将ItemsSource绑定(bind)到静态方法?

binding - 如何在基于 View 的 NSTableView 中从 CoreData 填充 NSPopupButton