2011-03-30 62 views
4

我已經創建了一個自定義MultiValue轉換器來執行一些邏輯,而MultiBinding到一個文本框;但是我不想使用convertBack,因爲綁定值沒有編譯時類型,並且默認轉換完美。這是可能的還是我必須以某種方式複製其中一個內部默認轉換器的功能?有沒有辦法讓一個雙向MultiBinding只在一個方向上使用一個轉換器?

圖:

values --> Convert() --> TextBox 
values <---------------- TextBox 

謝謝。

編輯:忘了提及我正在使用MultiValueConverter和MultiBinding,它似乎繞過了默認轉換器。

編輯:爲了擴展這個背後的推理:我有兩個對象A & B(同一類型),我想在TextBox中同時編輯。在Convert方法中,我檢查它們是否是相同的值,並顯示值或默認值。如果用戶更改了文本框中的值,我想要將相同的值發送回A & B.

編輯:我已經以迂迴方式解決了問題 - 請參閱下面的回覆。如果你有更好的解決方案,我仍然會欣賞它。再次感謝您的時間和幫助。

回答

5

好吧,我只是想出了一個解決方案...感謝大家發佈的建議。

事實證明,如果您創建傳遞值ValueConverter(就像Convert和ConvertBack的返回值一樣),並將其添加到MultiBinding的子綁定中,默認轉換將按預期發生。必須發生的事情是MultiBinding通常會繞過子綁定的defaultConverter。

+4

哇,這很有趣。我從來沒有嘗試過每個子綁定上的轉換器如何表現。我必須在某個時候嘗試。 – 2011-03-30 12:13:59

+1

是的,很好找! – CodeNaked 2011-03-30 12:18:22

6

在convertback只是返回值

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return YourLogic(value); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return value; 
    } 
+0

對不起忘了提,我使用的是MultiValueConverter/MultiBinding這似乎繞過「default'converter當我簡單的返回值。謝謝。 – 2011-03-30 11:44:47

4

沒有,有沒有辦法繞過轉換器。

正如@ArsenMkrt所解釋的,您必須通過轉換器傳遞原始值。

對於MultiBinding來說,這很困難,因爲您必須能夠將1值轉換爲N.您可能必須在第一遍中存儲轉換器中的信息以幫助您完成此操作。我很少使用雙向MultiBindings,因爲很難將其從單個值轉換爲多個值。

這裏還有一個缺失的部分。爲什麼要通過MultiBinding傳遞默認值?這不可能。 MultiBinding總是需要一個轉換器,因爲您將多個值合併爲一個值,然後將一個值擴展爲多個值。

+0

謝謝。我添加了一個編輯來解釋我的推理。在我的測試中,我返回了ConvertBack值的數組,但未執行defaultConversion。 – 2011-03-30 12:02:47

1

如何:

MyType Default { get; set; } 

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    // compare values, return value if equal or default 
} 

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
{ 
    return Enumerable.Repeat(value, targetTypes.Length).ToArray(); 
} 

返回函數傳遞值回所有的MultiBinding的來源。

+0

感謝您的建議,這需要與我的答案一起使用,因爲子綁定的默認ValueConverters將不會在MultiConversion後命中。 – 2011-03-30 12:14:28

0

您無法利用「默認」轉換並同時使用自定義值轉換器。因此,您需要在自定義值轉換器中實施「默認」轉換。像這樣利用了目標類型的默認類型轉換器:

public class MyConverter : IMultiValueConverter { 

    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     return System.Convert.ToString(values[0]); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { 
     // Get the type of the value, but assume string if it's null 
     Type valueType = typeof(string); 
     if (value != null) 
      valueType = value.GetType(); 

     // Convert value to the various target types using the default TypeConverter 
     object[] values = new object[targetTypes.Length]; 
     for (int i = 0; i < values.Length; i++) { 
      TypeConverter typeConverter = TypeDescriptor.GetConverter(targetTypes[i]); 
      if (typeConverter != null && typeConverter.CanConvertFrom(valueType)) 
       values[i] = typeConverter.ConvertFrom(value); 
      else 
       values[i] = value; 
     } 
     return values; 
    } 

} 
相關問題