C# 有没有办法使双向多重绑定只在一个方向上使用转换器?

C# 有没有办法使双向多重绑定只在一个方向上使用转换器?,c#,wpf,C#,Wpf,我创建了一个自定义多值转换器,在多绑定到文本框时执行一点逻辑;但是,我不想使用convertBack,因为绑定值没有编译时类型,默认转换工作得非常好。这是可能的,还是我必须以某种方式复制一个内部默认转换器的功能 图表: values --> Convert() --> TextBox values <---------------- TextBox 值-->转换()-->文本框 值仅返回convertback中的值 public object Convert(obje

我创建了一个自定义多值转换器,在多绑定到文本框时执行一点逻辑;但是,我不想使用convertBack,因为绑定值没有编译时类型,默认转换工作得非常好。这是可能的,还是我必须以某种方式复制一个内部默认转换器的功能

图表:

values --> Convert() --> TextBox
values <---------------- TextBox
值-->转换()-->文本框

值仅返回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;
    }

不,没有办法绕过转换器

正如@ArsenMkrt所解释的,您必须通过转换器传递原始值

对于多重绑定,这是很困难的,因为您必须能够将1值转换为N。您可能需要在第一次转换时将信息存储在转换器中,以帮助您完成此操作。我很少使用双向多重绑定,主要是因为很难将单个值转换回多个值

这里还缺一块。为什么要通过多重绑定传递默认值?那是不可能的。多重绑定总是需要一个转换器,因为您要将多个值折叠为一个值,然后将一个值扩展为多个值

这个怎么样:

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();
}

返回函数将值传递回多重绑定的所有源。

好的,我刚刚想出了一个解决方案。。。谢谢大家的建议

事实证明,如果您创建一个传递值转换器(就像Convert和ConvertBack的返回值一样),并将其添加到多重绑定的子绑定中,那么默认转换将按预期进行。必须发生的是,多绑定通常会绕过子绑定的defaultConverter

不能利用“默认”转换同时使用自定义值转换器。因此,您需要在自定义值转换器中实现“默认”转换。类似的内容利用了目标类型的默认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;
    }

}
公共类MyConverter:IMultiValueConverter{
公共对象转换(对象[]值,类型targetType,对象参数,System.Globalization.CultureInfo区域性){
返回System.Convert.ToString(值[0]);
}
公共对象[]转换回(对象值,类型[]目标类型,对象参数,System.Globalization.CultureInfo区域性){
//获取值的类型,但如果为null,则假定为字符串
类型valueType=typeof(字符串);
if(值!=null)
valueType=value.GetType();
//使用默认的TypeConverter将值转换为各种目标类型
object[]value=新对象[targetTypes.Length];
for(int i=0;i
很抱歉,我忘了提到我正在使用一个多值转换器/多绑定,当我简单地返回值时,它似乎绕过了“默认”转换器。谢谢,谢谢。我添加了一个解释我推理的编辑。在我的测试中,我返回了一个ConvertBack值数组,但是没有执行defaultConversion。如果使用
StringFormat
Wow,就不需要转换器。这很有趣。我从未尝试过每个子绑定上的转换器的行为。有一天我必须尝试一下。感谢您的建议,这需要与我的答案结合使用,因为子绑定的默认值转换器在多次转换后不会被命中。