FallbackValue如何与MultiBinding一起使用?
我问,因为它似乎没有工作。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中找不到任何东西。
这是一个老问题,但它可以使用一些解释。
A结合成功返回一个值:
- 到结合源的路径成功解析。
- 值转换器(如果有)可以转换结果值。
- 结果值对绑定目标(目标)属性有效。
如果1和2返回DependencyProperty.UnsetValue,目标属性 设置为FallbackValue的值,如果有一个可用。如果 没有FallbackValue,则使用目标属性的默认值 。
在提供的示例中,绑定成功解析为Hurr
和Durr
属性。空值是一个字符串的有效值,意味着绑定有效。
换句话说,当绑定无法返回值时使用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>
好问题!! – Chris 2010-04-19 16:32:08