2013-06-03 27 views
2

我正在尋找一種方式來指定多重綁定內的任何綁定失敗時的回退值。未綁定的多重綁定回退值

這裏就是綁定成功(即,A和B是有效路徑)

<MultiBinding Converter="{local:MultiConverter}"> 
    <Binding Path="A"/> 
    <Binding Path="B"/> 
</MultiBinding> 

在此情況下,是它失敗(路徑 'B' 被打破)

<MultiBinding Converter="{local:MultiConverter}"> 
    <Binding Path="A"/> 
    <Binding Path="Bb"/> 
</MultiBinding> 
的情況下

其爲傳輸器的值[1]傳遞值爲{DependencyProperty.UnsetValue}。我希望我可以做類似如下:

<MultiBinding Converter="{local:MultiConverter}" FallbackValue="Egg"> 
    <Binding Path="A"/> 
    <Binding Path="Bb"/> 
</MultiBinding> 

但不幸的是,該轉換器仍稱與未設置值。

雖然我知道,你可以做以下

<MultiBinding Converter="{local:MultiConverter}"> 
    <Binding Path="A"/> 
    <Binding Path="Bb" FallbackValue="Egg"/> 
</MultiBinding> 

這不是我想要的。如果任何子綁定失敗,我想要將整個多重綁定的回退指定爲X.我不想爲每個組件指定回退。

目前,我正在訴諸以下,但我想指定多重綁定,而不是轉換器的後備。

public class MultiConverter : MarkupExtension, IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values.Any(e => e == DependencyProperty.UnsetValue)) 
     { 
      return "failed!"; 
     } 
     return values[0].ToString() + values[1].ToString(); 
    } 

    public object[] ConvertBack(object values, Type[] targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 
} 

回答

1

也許使用TargetNullValue從轉換器返回null代替"failed!"

<MultiBinding Converter="{local:MultiConverter}" TargetNullValue="Failed!"> 
    <Binding Path="A"/> 
    <Binding Path="Bb" /> 
</MultiBinding> 

這樣,你做檢查的轉換器,如果轉換器返回null因爲任何約束力的錯誤是你的結果會選TargetNullvalue

+0

但這仍然意味着我必須檢查MultiConverter中未設置的值。這不是一個大問題,因爲我可以將該代碼放在所有轉換器的通用基類中,但似乎已經完成了一些工作,而且我只是錯誤地使用了它。 – pastillman

+0

@pastillman是的,你確實需要在轉換器中檢查它,因爲你在「全局」檢查所有傳入的值[i]'。否則,正如你所提到的,你可以在每個綁定的基礎上做到這一點,或者如果你不想傳遞無效綁定的話,可以使用'PriorityBinding'。讓Converter返回null是完全有效的,因爲它也有助於本地化你直接從xaml引用字符串的地方。 – Viv