有没有办法让双向MultiBinding只在一个方向上使用转换器?

时间:2011-03-30 11:37:27

标签: c# wpf

我创建了一个自定义MultiValue转换器,在MultiBinding到TextBox时执行一些逻辑;但是我不想使用convertBack,因为绑定值没有编译时类型,默认转换完美。这是可能的还是我必须以某种方式复制其中一个内部默认转换器的功能?

图:

values --> Convert() --> TextBox
values <---------------- TextBox

谢谢。

编辑:忘记提及我正在使用MultiValueConverter和MultiBinding,它似乎绕过默认转换器。

编辑:为了扩展这背后的推理:我有两个对象A&amp;我想在TextBox中同时编辑的B(相同类型)。在Convert方法中,我检查它们是否是相同的值,并显示值或默认值。如果用户更改了TextBox中的值,我希望将相同的值发送回A&amp;乙

编辑:我已经以迂回的方式解决了这个问题 - 请参阅下面的回复。如果您有更好的解决方案,我仍然希望听到它。再次感谢您的时间和帮助。

5 个答案:

答案 0 :(得分:6)

只需在convertback中返回值

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return YourLogic(value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }

答案 1 :(得分:5)

好的,我刚刚找到了解决方案......感谢大家发布建议。

事实证明,如果你创建一个传递ValueConverter(就像转换和ConvertBack的返回值),并将它添加到MultiBinding的子Bindings,默认转换将按预期发生。必须发生的是MultiBinding通常会绕过子绑定的defaultConverter。

答案 2 :(得分:4)

不,没有办法绕过转换器。

正如@ArsenMkrt解释的那样,你必须通过转换器传递原始值。

对于MultiBinding来说,这很难,因为您必须能够将1个值转换为N.您可能必须在第一遍中将信息存储在转换器中以帮助您执行此操作。我很少使用双向MultiBindings,因为很难将单个值转换回多个值。

这里还有一块缺失的东西。为什么要通过MultiBinding传递默认值?这不可能。 MultiBinding总是需要转换器,因为您将多个值折叠为一个,然后将一个值展开为多个。

答案 3 :(得分:1)

这个怎么样:

MyType Default { get; set; }

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    // compare values, return value if equal or default
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
    return Enumerable.Repeat(value, targetTypes.Length).ToArray();
}

return函数将值传递回MultiBinding的所有源。

答案 4 :(得分:0)

您无法利用“默认”转换并同时使用自定义值转换器。因此,您需要在自定义值转换器中实现“默认”转换。这样的东西利用了目标类型的默认TypeConverter:

public class MyConverter : IMultiValueConverter {

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        return System.Convert.ToString(values[0]);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) {
        // Get the type of the value, but assume string if it's null
        Type valueType = typeof(string);
        if (value != null)
            valueType = value.GetType();

        // Convert value to the various target types using the default TypeConverter
        object[] values = new object[targetTypes.Length];
        for (int i = 0; i < values.Length; i++) {
            TypeConverter typeConverter = TypeDescriptor.GetConverter(targetTypes[i]);
            if (typeConverter != null && typeConverter.CanConvertFrom(valueType))
                values[i] = typeConverter.ConvertFrom(value);
            else
                values[i] = value;
        }
        return values;
    }

}