【问题标题】:Two way Multiconverter or Converter with property具有属性的两路多路转换器或转换器
【发布时间】:2011-11-23 19:26:35
【问题描述】:

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

{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 派生您的 Converter 以允许 DependencyProperties。这可行,并允许您在 What.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 的一个很大的限制?

【问题讨论】:

    标签: wpf data-binding ivalueconverter imultivalueconverter


    【解决方案1】:

    就个人而言,我实际上建议重新考虑一下,然后做:

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

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

    【讨论】:

    • 1.是我最初的解决方案,但决定在盒子内的速记更容易立即识别,而不是随处可见的组合框。想象一个带有“12 英寸”编辑框的数据网格,与具有 2 列的数据网格相比,1 列表示值,1 列表示单位。这也有值输入的问题。如果用户在“英寸”上的组合框中输入 12,然后将单位更改为“英尺”,这是否意味着用户想要 1 英尺或 12 英尺? (基本上我们应该在组合框发生变化时转换刚刚输入的内容)。
    • 再次,这实际上只是我在使用多值转换器或具有依赖属性的转换器时遇到的问题的一个小例子。一般来说,我想看看我是否能以某种方式获得一个带有可绑定转换器参数的转换器,而不管转换器的确切用法如何。
    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2017-01-13
    • 2011-01-06
    相关资源
    最近更新 更多