WPF绑定FallbackValue设置为Binding。

39

有没有一种方式可以将另一个绑定作为备用值?

我想要做这样的事情:

<Label Content="{Binding SelectedItem.Name, ElementName=groupTreeView,
                         FallbackValue={Binding RootGroup.Name}}" />

如果有其他方法能够实现这个技巧,那将是非常棒的。

3个回答

82
你所需要的是一种名为PriorityBinding(在列表中排名第6)的东西。(来自文章)
优先绑定的重点在于按照最理想到最不理想的顺序命名多个数据绑定。这样,如果第一个绑定失败、为空和/或默认,则另一个绑定可以取而代之。例如:
<TextBox>
    <TextBox.Text>
        <PriorityBinding>
            <Binding Path="LastNameNonExistant" IsAsync="True" />
            <Binding Path="FirstName" IsAsync="True" />
        </PriorityBinding>
    </TextBox.Text>
</TextBox>

31
问题在于PriorityBinding将空字符串视为成功绑定。 - Shimmy Weitzhandler
9
根据MSDN的说明,“DependencyProperty.UnsetValue” 不被视为成功返回值。如果您绑定的值为null,只需在绑定中使用一个转换器来返回该属性即可。@Shimmy - Steffen Winkler

4
如果您在使用 PriorityBinding 时遇到绑定到 null 值的问题(就像 Shimmy 所指出的),您可以使用 MultiBinding 和类似于以下方式的 MultiValueConverter:
public class PriorityMultiValueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return values.FirstOrDefault(o => o != null);
    }

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

使用方法:

<TextBox>
    <TextBox.Text>
        <MultiBinding Converter="{StaticResource PriorityMultiValueConverter}">
            <Binding Path="LastNameNull" />
            <Binding Path="FirstName" />
        </MultiBinding>
    </TextBox.Text>
</TextBox>

3
在什么条件下您希望使用备用值?如何确定绑定失败?即使绑定到 null 值,绑定仍然有效。
我认为一个好的选择可能是使用转换器将绑定返回的 null 值转换为默认值。但我不确定如何将其默认为另一个绑定值。
查看这里的转换器

在我的情况下,我有90%以上的把握DataContext上会有一个特定的属性,但如果没有的话,我想回退到调用.ToString() - tobriand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接