2012-10-29 41 views
1

我有一個轉換器,它接受一個I​​Enumerable並返回一個包含多行的字符串。 convertback函數做了相反的處理,它接受一個包含多行的字符串並返回一個List。我在幾個地方使用它,它效果很好。在OneWay綁定中使用ConvertBack功能代替Convert函數

我的問題是,我現在有我想使用Convert和ConvertBack函數的位置(例如,在OneWay綁定中,它使用ConvertBack函數)這在XAML中可能嗎?

回答

3

創建這樣的轉換器是可能的,例如:

class ListStringConverter : IValueConverter 
{ 
    public bool IsListToString { get; set; } 

    public ListStringConverter() 
    { 
     IsListToString = true; 
    } 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return IsListToString ? FromListToString(value) : FromStringToList(value); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return IsListToString ? FromStringToList(targetListItem) : FromListToString(targetListItem); 
    } 


    public object FromListToString(object list) 
    { 
     .... // Conversion Logic 
    } 

    public object FromStringToList(object myString) 
    { 
     .... // Conversion Logic 
    } 

} 

在XAML可以這樣

<ListStringConverter x:Key="StringToListConverter " IsListToString ="False" /> 
+0

感謝您的解決方案。這將工作,雖然我需要一種方法,不會強迫我回去編輯預先存在的代碼。 – Lukiahas

+0

@Lukiahas當轉換器被創建時,'IsListToString'屬性實際上是從XAML設置的,儘管當轉換器被使用時你也可以將它設置爲'ConverterParameter' – Rachel

+0

正如Rachel所說,我認爲你不會需要編輯預先存在的代碼(轉換器除外),因爲您有一個IsListToString的默認值(在轉換器的構造函數中),您只需對現有轉換器稍作修改。 – Blachshma

3

我不知道它的可能與否,但即使可能,我也不會做這樣的事情。

轉換器用於將綁定值從一個值轉換爲另一個值,如果您改變了該值,那麼您將改變WPF的核心功能的一部分,這將使其他開發人員在將來非常困惑。

我反而會做第二個轉換器,爲您做逆向轉換。

如果轉換時間很長,我有時會將重複的代碼拉出來,並將其放在轉換器類文件的自己的方法中,並使兩個轉換器只調用該方法。

+0

聲明它你大概是對的。我希望在純XAML中做到這一點很簡單。我剛剛創建了一個靜態的TextToList方法和一個靜態的ListToText方法,並且只有兩個轉換器引用它們。謝謝。 – Lukiahas

+0

@Lukiahas [Blachshma的回答](http://stackoverflow.com/a/13125040/302677)實際上也是一個體面的做法,使用單個Converter,儘管您可以將布爾值設置爲ConverterParameter而不是如果你想要創建轉換器,請設置它。 – Rachel