我正在开发一个具有一些依赖属性的用户控件,即;
public static readonly DependencyProperty TitleWidthProperty = DependencyProperty.Register("TitleWidth", typeof(double), typeof(FormList));
好的,很好,所以当在XAML中使用它时,我可以使用正常的'double'值轻松绑定到所述属性,就像这样;
<local:FormList TitleWidth="100">
真棒!正是我想要的,像梦一样。但是,我想尝试一些更聪明的东西并说出来; (显然其他一些代码会决定宽度)
<local:FormList TitleWidth="Auto">
但无论我对依赖属性做什么,我得到的只是设计器中的FormatException,因为“Auto”是一个字符串而不是double。我尝试了各种PropertyMetadata,ValueCorercion和ValidateValue回调的组合无济于事。我知道有一种方法可以做到这一点,因为它适用于一些内置控件,例如;
<!-- 'Red is a color and not a 'Brush' so there is some conversion happening here.-->
<Border Background="Red"/>
有关何处获取更多信息的任何想法或信息?
答案 0 :(得分:2)
正在进行默认值转换:
开始和结束引号中包含的字符串值由XAML处理器处理。对于属性,默认处理行为由基础CLR属性的类型确定。
使用以下处理顺序,属性值由以下之一填充:
如果XAML处理器遇到大括号或从MarkupExtension派生的对象元素,则首先评估引用的标记扩展,而不是将值作为字符串处理,并且标记扩展返回的对象是用作值。在许多情况下,标记扩展返回的对象将是对现有对象的引用,或者是将评估推迟到运行时的表达式,并且不是新实例化的对象。
如果使用属性TypeConverter声明属性,或者使用属性TypeConverter声明该属性的值类型,则属性的字符串值将作为转换输入提交给类型转换器,并且转换器将返回一个新的对象实例。
- 醇>
如果没有TypeConverter,则尝试直接转换为属性类型。最后一个级别是在XAML语言基元类型之间的解析器本机值的直接转换,或者在枚举中检查命名常量的名称(然后解析器访问匹配的值)。
您可以创建一个TypeConverter,它应该按照您想要的方式处理字符串。 (例如,与某些WPF控件一样,将Auto
转换为double.NaN
)
答案 1 :(得分:0)
而不是double
,您需要一种支持自动尺寸概念的类型,例如GridLength
。然后,当然,您的控件需要将该值传递给知道如何处理它的内容(例如Grid
),或者您需要自己编写该逻辑。