2010-04-19 142 views
8

我問,因爲它似乎沒有工作。FallbackValue如何與MultiBinding一起使用?

假設我們要綁定到下列對象:

public class HurrDurr 
{ 
    public string Hurr {get{return null;}} 
    public string Durr {get{return null;}} 
} 

那麼,這樣看來,如果我們使用了MultiBinding針對此故障預置值將顯示,對不對?

<TextBlock> 
    <TextBlock.Text>         
     <MultiBinding StringFormat="{}{0} to the {1}" 
         FallbackValue="Not set! It works as expected!)"> 
      <Binding Path="Hurr"/> 
      <Binding Path="Durr"/> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

然而結果是,事實上,「到」。 甚至迫使綁定返回DependencyProperty.UnsetValue不起作用:

<TextBlock xmnlns:base="clr-namespace:System.Windows;assembly=WindowsBase"> 
    <TextBlock.Text>         
     <MultiBinding StringFormat="{}{0} to the {1}" 
      FallbackValue="Not set! It works as expected!)"> 
      <Binding Path="Hurr" 
       FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" /> 
      <Binding Path="Durr" 
       FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

嘗試同樣與TargetNullValue,這也是一個胸圍周圍的所有道路。

所以看起來MultiBinding將永遠不會使用FallbackValue。這是真的,還是我錯過了什麼?


多一點亂搞,我發現一個轉換器可以返回UnsetValue我需要:

class MultiValueFailConverter : IMultiValueConverter 
{ 
    public object Convert(
     object[] values, 
     Type targetType, 
     object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     if (values == null || 
      values.Length != 2 || 
      values.Any(x=>x == null)) 
      return System.Windows.DependencyProperty.UnsetValue; 
     return values; 
    } 

    public object[] ConvertBack(
     object value, 
     Type[] targetTypes, 
     object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException("Too complex hurt brain."); 
    } 
} 

然而,這似乎是一個骯髒污穢的黑客。我認爲這樣的場景會在框架中被考慮。然而,我在Reflector中找不到任何東西。

+0

好問題!! – Chris 2010-04-19 16:32:08

回答

7

這是一個老問題,但它可以使用一些解釋。

FallbackValue documentation

A結合成功返回一個值:

  1. 到結合源的路徑成功解析。
  2. 值轉換器(如果有)可以轉換結果值。
  3. 結果值對綁定目標(目標)屬性有效。

如果1和2返回DependencyProperty.UnsetValue,目標屬性 設置爲FallbackValue的值,如果有一個可用。如果 沒有FallbackValue,則使用目標屬性的默認值 。

在提供的示例中,綁定成功解析爲HurrDurr屬性。空值是一個字符串的有效值,意味着綁定有效。

換句話說,當綁定無法返回值時使用FallbackValue,並且在提供的示例中,綁定確實提供了有效值。

採取例如每個是基於關原示例以下代碼段:

實施例1
的Hurr和杜爾屬性正確綁定; null是一個有效的值,FallbackValue永遠不會被看到。

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding FallbackValue="Binding is valid. I will never be seen." StringFormat="{}{0} to the {1}"> 
      <Binding Path="Hurr" /> 
      <Binding Path="Durr" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

實施例2
的Hurr和杜爾屬性不正確綁定;將會看到FallbackValue。

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding FallbackValue="Binding paths are invalid. Look at me." StringFormat="{}{0} to the {1}"> 
      <Binding Path="xHurr" /> 
      <Binding Path="xDurr" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

實施例3
如果一個結合路徑無效,則FallbackValue可以看出。

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding FallbackValue="One binding path is invalid. Look at me." StringFormat="{}{0} to the {1}"> 
      <Binding Path="xHurr" /> 
      <Binding Path="Durr" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

實施例4
如同前面的實施例中,結合是正確的,所以FallbackValue將不被使用。此外,MultiBinding父級的每個屬性的FallbackValue應引用要用於MultiBinding的目標屬性的FallbackValue,而不是用於子綁定。

<TextBlock xmlns:base="clr-namespace:System.Windows;assembly=WindowsBase"> 
    <TextBlock.Text> 
     <MultiBinding FallbackValue="Binding is valid. I will never be seen." StringFormat="{}{0} to the {1}"> 
      <Binding FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" Path="Hurr" /> 
      <Binding FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" Path="Durr" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

實施例5
的結合是即使不在Binding性能,因爲提供了一種路徑仍然有效的結合會使用任何對象它被綁定到。

<TextBlock xmlns:base="clr-namespace:System.Windows;assembly=WindowsBase"> 
    <TextBlock.Text> 
     <MultiBinding FallbackValue="Binding is still valid. I will never be seen." StringFormat="{}{0} to the {1}"> 
      <Binding FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" /> 
      <Binding FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

實施例6
最後,如果一個轉換器被添加到任何結合特性來強制UnsetValue,則MultiBinding FallbackValue可以看出:

轉換

internal class ForceUnsetValueConverter : IValueConverter 
{ 
    #region Implementation of IValueConverter 

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

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

XAML

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding FallbackValue="Binding is valid, but look at me. I'm an UnsetValue." StringFormat="{}{0} to the {1}"> 
      <Binding Converter="{StaticResource ForceUnset}" Path="Hurr" /> 
      <Binding Path="Durr" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 
相關問題