依赖属性转换器上的UserControl

本文关键字:UserControl 转换器 属性 依赖 | 更新日期: 2023-09-27 17:54:22

我正在研究一个用户控件,它有一些依赖属性,即;

public static readonly DependencyProperty TitleWidthProperty = DependencyProperty.Register("TitleWidth", typeof(double), typeof(FormList));

很好,所以当在XAML中使用它时,我可以很容易地使用普通的'double'值绑定到该属性,比如;

<local:FormList TitleWidth="100">

太棒了!正是我想要的,就像做梦一样。然而,我想尝试一些更聪明的东西,说;(显然其他代码将决定宽度)

<local:FormList TitleWidth="Auto">

但是无论我对依赖属性做了什么,我在设计器中得到的都是FormatException,因为"Auto"是字符串而不是双精度类型。我尝试了PropertyMetadata, ValueCorercion和ValidateValue回调的各种组合,但无济于事。我知道有一种方法可以做到这一点,因为它适用于一些内置控件,例如;

<!-- 'Red is a color and not a 'Brush' so there is some conversion happening here.-->
<Border Background="Red"/>

>

依赖属性转换器上的UserControl

默认值转换正在进行:

包含在开始和结束引号中的字符串值由XAML处理器处理。对于属性,默认处理行为由底层CLR属性的类型决定。

属性值由以下处理顺序之一填充:

  1. 如果XAML处理器遇到大括号,或者从MarkupExtension派生的对象元素,则首先计算引用的标记扩展,而不是将值作为字符串处理,并且使用标记扩展返回的对象作为值。在许多情况下,标记扩展返回的对象将是对现有对象的引用,或者将求值延迟到运行时的表达式,而不是新实例化的对象。

  2. 如果该属性是用带属性的TypeConverter声明的,或者该属性的值类型是用带属性的TypeConverter声明的,则该属性的字符串值将作为转换输入提交给类型转换器,转换器将返回一个新的对象实例。

  3. 如果没有TypeConverter,则尝试直接转换为属性类型。最后一层是在XAML语言基本类型之间对解析器原生值进行直接转换,或者检查枚举中命名常量的名称(然后解析器访问匹配的值)。

从MSDN

你可以创建一个TypeConverter,它应该以你想要的方式处理字符串。(例如,一些WPF控件将Auto变为double.NaN)

需要一种支持自动大小概念的类型来代替double,例如GridLength。然后,当然,您的控件需要将该值传递给知道如何处理它的东西(例如Grid),或者您需要自己编写该逻辑。