我问是因为它似乎不起作用。
假设我们绑定到以下对象:
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>然而,其结果实际上是“to "。即使强制绑定返回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.");
}
}然而,这似乎是一个肮脏的污秽的黑客。我认为这样的场景将在框架中得到考虑。不过,我在反射镜里什么也找不到。
发布于 2013-01-09 20:59:44
这是个老生常谈的问题,但可能需要一些解释。
来自FallbackValue documentation
A绑定在以下情况下成功返回一个值:
绑定源的路径解析successfully.
如果1和2返回DependencyProperty.UnsetValue,则目标属性设置为FallbackValue的值(如果可用的话)。如果没有FallbackValue,则使用目标属性的默认值。
在提供的示例中,绑定成功地解析为Hurr和Durr属性。Null是字符串的有效值,这意味着绑定是有效的。
换句话说,当绑定无法返回值时使用FallbackValue,而在提供的示例中,绑定确实提供了一个有效值。
例如,以原始示例为基础的下列每个片段:
示例1
Hurr和Durr属性被正确绑定;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和Durr属性没有正确绑定;将看到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。此外,用于FallbackValue父级的每个子Binding属性的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>https://stackoverflow.com/questions/2668987
复制相似问题