2013-01-09 32 views
1

我有一個MultiBinding轉換器,它決定了控件的可見性,具體取決於我的Binding字段是否都計算爲true。如果由於某種原因它不能達到這兩種布爾屬性,我想將它們設置爲true。例如:在MultiBinding中處理綁定的布爾故障預置值

,我目前擁有的代碼是:

  <MultiBinding Converter="{StaticResource AndToVisibilityConverter1}" FallbackValue="Visible"> 
       <Binding Path="IsConnected" FallbackValue="true" /> 
       <Binding Path="CurrentUser.IsConsumerOnlyAgent" Converter="{StaticResource InvertedBooleanConverter1}" FallbackValue="True" /> 
      </MultiBinding> 

代碼運行正常,但是我得到了我的IDE的輸出指示錯誤信息:

System.Windows.Data Error: 11 : Fallback value 'True' (type 'String') cannot be converted for use in 'Visibility' (type 'Visibility'). BindingExpression:Path=IsConnected; DataItem=null; target element is 'StackPanel' (Name=''); 

哪個我已經指出這個轉換器,並驗證它是XAML錯誤的地方。對不起,這裏有無知,但有沒有辦法可以設置FallbackValue到每個這些綁定評估爲「真」失敗後獲得設置路徑?在此先感謝

更新:

下面是我的能見度轉換器(我用這幾個地方在我的應用程序,只想補充後備值)的代碼:

internal class AndToVisibilityConverter : IMultiValueConverter 
    { 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
    if (values == null) 
     return Visibility.Collapsed; 

    foreach (var value in values) 
    { 
     if (value == null || !(value is bool)) 
      return Visibility.Collapsed; 

     if (!((bool) value)) 
      return Visibility.Collapsed; 
    } 

    return Visibility.Visible; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
    throw new NotImplementedException(); 
    } 
    } 
+0

你能包含的代碼轉換器? – slugster

+0

隨着轉換器 –

回答

8

FallbackValue應該值是Visibility值回退到當結合失敗上:

<Binding Path="CurrentUser.IsConsumerOnlyAgent" 
    Converter="{StaticResource InvertedBooleanConverter1}" 
       FallbackValue="Visible" /> 

EDIT

FallbackValue documentation

fallbackValue
的屬性或相同類型的目標屬性的對象元素值。請參閱該類型的文檔以瞭解XAML 的使用信息。該類型可能支持或不支持屬性語法 的值,或者可能支持或不支持對象元素語法(其中 需要該類型的默認構造函數)。因此,目標屬性類型 將影響您使用FallbackValue屬性的值所使用的語法。

在這種情況下,MultiBinding的目標屬性是Visibility屬性。即使子MultiBinding屬性的值希望爲bool,但父MultiBinding期望來自綁定的Visiblity值。這意味着每個MultiBinding屬性的FallbackValue應該具有可見性屬性的FallbackValue。

似乎有點違反直覺,但在通過(IMO)考慮時確實有意義,如果MultiBindng中沒有轉換器,則綁定的返回值應該是可見性值。從等式中刪除轉換器,它可能有助於清除事情。

對於您的情況,請跳過每個MultiBinding值的FallbackValue,並像現在一樣在MultiBinding上設置FallbackValue。

<MultiBinding Converter="{StaticResource AndToVisibilityConverter1}" FallbackValue="Visible"> 
    <Binding Path="IsConnected" /> 
    <Binding Path="CurrentUser.IsConsumerOnlyAgent" Converter="{StaticResource InvertedBooleanConverter1}" /> 
</MultiBinding> 
+0

更新我想我不明白爲什麼FallbackValue會是一個可見性,因爲我給我的多轉換器的兩個綁定是bools?如果它無法到達那個屬性,它應該不是一個bool發送到轉換器?我理解備用值,我想我對多重綁定轉換器有些困惑。此外,InvertedBooleanConverter只是反轉布爾,多重綁定轉換器AndToVisibilityConverter設置可見性 –

+0

我同意這有點令人困惑。當你將它放在「MultiBinding結果應該是什麼?」的角度時那麼子綁定應該返回一個Visiblity值。看到我更新的答案。 –

+0

是的,基本上這就是我在想,如果它失敗,只需將轉換器本身的回退值設置爲可見即可。感謝您的意見。我會堅持把它檢查爲固定的,看看我是否能夠設置兩個綁定的回退值。如果沒有,我會訴諸於此。雖然,我想要考慮兩者之間會有什麼不同,如果有的話。 –

2

經過一番測試,似乎當在MultiBinding「子結合」失敗(由於UnsetValue或未能找到綁定屬性)子結合的FallbackValues獲得通過到對MultiBinding的轉換器。

奇數部分是,FallbackValue對子結合類型需要匹配MultiBinding的目標。我不明白這個要求,因爲MultiBinding轉換器可以從不符合該類型的綁定中獲取值。

考慮到這一點,最簡單的解決方法是修改MultiBinding的Converter以處理多種類型。在這種情況下,它需要處理布爾和可見性。

即我的轉換功能是這樣的:

public object Convert(object[] values, Type targetType, object  parameter, System.Globalization.CultureInfo culture) 
    { 
     var bools = values.Where(b => b is bool).Cast<bool>(); 
     var vis = values.Where(v => v is Visibility).Cast<Visibility>(); 

     // if no usable values, return unset 
     if(vis.Count() + bools.Count() == 0) 
      return DependencyProperty.UnsetValue; 

     // if true, return visible 
     if(bools.All(b => b) && vis.All(v => v == Visibility.Visible)) 
      return Visibility.Visible; 

     // if false, see if hidden or collapsed is specified 
     var param = parameter as string; 

     Visibility ret; 
     if(Enum.TryParse(param, out ret)) 
      return ret; 

     // default to collapsed 
     return Visibility.Collapsed; 
    } 

此解決方案應該提供指定可見真正的和別的東西虛假申請行爲:

<MultiBinding Converter="{x:Static con:MultiAndToVisibilityConverter.Instance}"> 
     <Binding Path="IsChecked" ElementName="CheckButton"/> 
     <Binding Path="RadioOne.IsChecked" FallbackValue="{x:Static Visibility.Visible}" 
       Converter="{x:Static con:BoolInverterConverter.Instance}"/> 
    </MultiBinding>