WPF绑定与显式转换

时间:2009-11-12 01:41:11

标签: wpf data-binding type-conversion converter

我的问题可能是其他转换问题的重复,但我觉得我的不同。

这里...... [简化示例]。

public class DataWrapper<T>
{
    public T DataValue{ get; set; }

    public DataWrapper(T value)
    {
        DataValue = value;
    }

    public static explicit operator DataWrapper<T> (T value)
    {
        return new DataWrapper<T>(value);
    }

    public static implicit operator T(DataWrapper<T> data)
    {
        return data.DataValue;
    }
}

现在,在我的ViewModel中:

public class ViewModel
{
    public DataWrapper<string> FirstName { get;set; }
    public DataWrapper<string> LastName { get; set; }
}

在XAML中:

<TextBlock Text="{Binding FirstName}" />
<TextBlock Text="{Binding LastName}" />

我的问题是,这会有效吗? WPF绑定是否会调用Implicit类中的ExplicitDataWrapper<T>转换器,而不需要为每个IValueConverter实现TextBlock

2 个答案:

答案 0 :(得分:5)

我不能说它是否会起作用,因为我没有测试过它。但是,如果它不起作用,您可以尝试使用TypeConverter类型DataWrapper

例如:

[TypeConverter(typeof(DataWrapperConverter))]
public class DataWrapper
{
    ...
}

public class DataWrapperConverter : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, System.Type sourceType)
    {
        return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        if (value is string)
        {
            return (DataWrapper<string>)value;
        }

        return base.ConvertFrom(context, culture, value);
    }
}

您可以使用Type类上的通用帮助器方法更动态地处理类型转换。

答案 1 :(得分:1)

不,WPF不会调用隐式转换器。您必须使用值转换器或Paul的TypeConverter建议。