WPF привязка с явным преобразованием - PullRequest
4 голосов
/ 12 ноября 2009

Мой вопрос может быть повторением другого вопроса о конверсии, но я чувствую, что у меня все по-другому.

Здесь идет ... [упрощенный пример].

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 ]

5 голосов
/ 12 ноября 2009

Я не могу сказать, будет ли это работать или нет, так как я не проверял это. Однако, если это не сработает, вы можете попробовать использовать 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 голос
/ 12 ноября 2009

Нет, WPF не будет вызывать неявный конвертер. Вы должны использовать конвертер значений или предложение TypeConverter от Paul.

...