【发布时间】:2014-08-04 22:31:53
【问题描述】:
在 WPF 中可以绑定到静态属性。现在我知道了两种方法:
Content="{x:Static stat:Statics.CurrentUser}"
或者:
Content="{Binding Source={x:Static stat:Statics.CurrentUser}}"
这两种方法有什么区别吗?
【问题讨论】:
标签: wpf binding properties static
在 WPF 中可以绑定到静态属性。现在我知道了两种方法:
Content="{x:Static stat:Statics.CurrentUser}"
或者:
Content="{Binding Source={x:Static stat:Statics.CurrentUser}}"
这两种方法有什么区别吗?
【问题讨论】:
标签: wpf binding properties static
这种情况下的主要区别是x:Static不执行额外的转换
当您创建不直接属于属性值类型的 x:Static 引用时要小心。在 XAML 处理序列中,标记扩展提供的值不会调用额外的值转换。即使您的 x:Static 引用创建一个文本字符串也是如此,并且基于文本字符串的属性值的值转换通常针对该特定成员或返回类型的任何成员值发生。
所以假设你做到了
<TextBlock Text="{x:Static SystemColors.ActiveBorderBrush}"/>
这将导致运行时错误:
“#FFB4B4B4”不是属性“Text”的有效值。
因为SolidColorBrush 不是String 而
<TextBlock Text="{Binding Source={x:Static SystemColors.ActiveBorderBrush}}"/>
会正常工作并显示#FFB4B4B4,因为它将执行ToString() 转换。此外,如果没有Binding,您将无法访问静态对象的实例属性,因此例如您将无法获得该画笔的Color 属性
<TextBlock Text="{Binding Source={x:Static SystemColors.ActiveBorderBrush}, Path=Color}"/>
【讨论】: