1

我需要将一个两部分的值转换为一个字符串,然后再转换回来,例如:

{Value = 12.0, Units = DimensionUnits.Inches}

转换为

"12 in"

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

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

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 派生转换器以允许 DependencyProperties。这有效并允许您在 Whatre.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 的一个很大的限制?

4

1 回答 1

3

就个人而言,我实际上建议重新考虑这一点,并执行以下任一操作:

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

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

于 2011-11-23T19:33:03.697 回答