2010-04-19 143 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> 
相关问题