代码之家  ›  专栏  ›  技术社区  ›  Tri Q Tran

带显式转换的WPF绑定

  •  4
  • Tri Q Tran  · 技术社区  · 16 年前

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

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

    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 Explicit DataWrapper<T> 类,而不需要实现 IValueConverter 每人 TextBlock .

    2 回复  |  直到 16 年前
        1
  •  6
  •   Paul Stovell    16 年前

    我不能说它是否有效,因为我还没有测试过它。但是,如果它不起作用,您可以尝试使用 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);
        }
    }
    

        2
  •  2
  •   itowlson    16 年前

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