【问题标题】:DependencyProperty Converter On UserControlUserControl 上的 DependencyProperty 转换器
【发布时间】:2011-05-03 17:58:06
【问题描述】:

我正在开发一个具有一些依赖属性的用户控件,即;

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

好的,太好了,所以当在 XAML 中使用它时,我可以像这样使用普通的“双”值轻松绑定到所述属性;

<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"/>

有什么想法或信息可以从哪里获得更多信息?

【问题讨论】:

    标签: c# wpf dependency-properties default-value


    【解决方案1】:

    正在进行默认值转换:

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

    属性值由以下之一填充,使用此处理顺序:

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

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

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

    From MSDN

    你可以创建一个 TypeConverter 来处理你想要的字符串。 (例如,与某些 WPF 控件一样,将 Auto 转换为 double.NaN

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你的回答有点含糊。你是什​​么意思'传递......到某事' 什么是什么?此外,在我的颜色示例中,“画笔”不支持颜色分配,所以我认为这是我正在寻找的真正答案。
      猜你喜欢
      • 2012-03-02
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 2015-02-16
      相关资源
      最近更新 更多