【问题标题】:WPF binding with explicit conversion具有显式转换的 WPF 绑定
【发布时间】:2009-11-12 01:41:10
【问题描述】:

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

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

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 绑定会在我的DataWrapper&lt;T&gt; 类中调用ImplicitExplicit 转换器,而不是需要为每个TextBlock 实现IValueConverter

【问题讨论】:

    标签: wpf data-binding type-conversion converter


    【解决方案1】:

    我不能说它是否有效,因为我还没有测试过。但是,如果它不起作用,您可以尝试将 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 类上的通用辅助方法来更动态地处理您的类型转换。

    【讨论】:

    • 谢谢保罗。您能否也将您正在谈论的通用辅助方法链接我?
    【解决方案2】:

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

    【讨论】:

    • 3 行代码用于隐式转换。另一个 17 告诉 WPF 使用它。加上每个绑定分配的额外实例。那是典型的 WPF,不是吗。
    猜你喜欢
    • 2016-11-03
    • 2012-07-20
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 2013-05-09
    相关资源
    最近更新 更多