2009-11-12 94 views
4

我的問題可能是其他轉換問題的重複,但我覺得我是不同的。WPF與顯式轉換綁定

這裏去... [簡單示例]。

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; 
    } 
} 

現在,在我的視圖模型:

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<T>類中調用ImplicitExplicit轉換器,而不需要爲每個TextBlock實現IValueConverter

回答

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類通用輔助方法更動態處理您的類型轉換。

+0

謝謝保羅。你能不能也把我正在談論的通用幫助器方法聯繫起來? – 2009-11-12 02:58:17

1

不,WPF不會調用隱式轉換器。您必須使用值轉換器或Paul的TypeConverter建議。

+6

用於隱式轉換的3行代碼。另有17個告訴WPF使用它。再加上爲每一個綁定分配的額外實例。這是典型的WPF,不是。 – 2012-04-19 13:36:48