具有属性的双向Multiconverter或转换器

时间:2011-11-23 19:26:36

标签: wpf data-binding ivalueconverter imultivalueconverter

我需要将两部分值转换为字符串然后再返回例如:

{Value = 12.0, Units = DimensionUnits.Inches}

转换为

"12 in"

使用多值转换器从源转换非常简单但如果用户不在字符串中提供单元类型则无法转换回来,因此多值转换器看起来不像我需要的解决方案。

直接转换器参数不起作用,因为需要绑定单元类型,所以我研究了如何创建可绑定参数。创建一个可绑定参数实际上非常简单 - 从DependencyObject派生 - 但是你遇到的问题是你的转换器没有生活在可视树中 - 因此无法绑定到任何东西 - 有2个解决方案:

http://tomlev2.wordpress.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/ http://shujaatsiddiqi.blogspot.com/2011/02/wpf-binding-converter-parameter.html

第一种方法从Freezable而不是DependencyObject派生您的Converter以允许DependencyProperties。这有效,并且允许您在Whatever.Resources部分中进行绑定,但它具有极其奇怪的行为,例如仅在第一次在整个应用程序中使用时才监听绑定。

第二种方法似乎根本不起作用。当源更改时,依赖项属性永远不会更新。

<pf:BindingReflector Target="{Binding Source={StaticResource DistanceConverter}, Path=Units, Mode=TwoWay}"
    Source="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=g:TestWindow, AncestorLevel=1}, Path=Units, Mode=TwoWay}"/>

有没有人知道这个问题的解决方案,还是这是WPF的一个很大的限制?

1 个答案:

答案 0 :(得分:3)

就个人而言,我实际上建议重新考虑一下,并做其中之一:

  1. 使用IMultiValueConverter保持最终字符串单向,并将其输入为两个单独的项目。这似乎是一种合理的方法,因为这些单元似乎是一个具有特定选项集的枚举。单位的组合框和金额的文本框似乎是合适的,总显示可以使用单向转换器完成。

  2. 在ViewModel中显式处理此转换。这样做的好处是可以实现更好的验证处理,这可能是必需的,因为在一个控件中输入两个单独的值(数量+单位)可能无法正确验证。通过将逻辑直接移动到ViewModel而不是绑定到属性,您可以以干净的方式正确处理错误。