4

私の質問は他の変換の質問の繰り返しかもしれませんが、私の質問は違うと感じています。

ここに行きます...[簡略化された例]。

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バインディングは、 for eachを実装する必要はなく、クラス内のImplicitandExplicitコンバーターを呼び出しますか?DataWrapper<T>IValueConverterTextBlock

4

2 に答える 2

6

私はそれをテストしていないので、それがうまくいくかどうかは言えません。ただし、機能しない場合は、タイプにaTypeConverterを使用してみてください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クラスの汎用ヘルパーメソッドを使用して、型変換をより動的に処理できます。

于 2009-11-12T01:50:37.907 に答える
2

いいえ、WPFは暗黙的なコンバーターを呼び出しません。値コンバーターまたはPaulのTypeConverter提案を使用する必要があります。

于 2009-11-12T01:55:44.353 に答える