我问是因为它似乎不起作用。
假设我们绑定到以下对象:
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 中找不到任何东西。