2009-12-16 101 views
30

有没有办法让另一个绑定作为回退值?WPF绑定FallbackValue设置为绑定

我试图做这样的事情:

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

如果任何人有另一种伎俩,把它关闭,这将是巨大的。

回答

62

你所寻找的是(this名单#6)称为PriorityBinding东西

(文章)

点到PriorityBinding是 名多数数据绑定的顺序是最不希望的 。 这种方式如果第一个绑定失败, 是空的和/或默认的,另一个 绑定可以取代它。

例如,

<TextBox> 
    <TextBox.Text> 
     <PriorityBinding> 
      <Binding Path="LastNameNonExistant" IsAsync="True" /> 
      <Binding Path="FirstName" IsAsync="True" /> 
     </PriorityBinding> 
    </TextBox.Text> 
</TextBox> 
+23

问题是,PriorityBinding将空字符串视为成功绑定 – Shimmy 2010-02-08 20:39:59

+4

[MSDN](https://msdn.microsoft.com/zh-cn/library/system.windows.data.prioritybinding%28v=vs.110 %29.aspx):'DependencyProperty.UnsetValue的值不被视为成功的返回值。“ - 所以只需在绑定中使用Converter即可,如果您的值为null,则返回该属性。 @Shimmy – 2015-11-05 09:14:38

3

在什么条件下,您希望使用回退值?你如何确定绑定失败?即使绑定为空值,绑定仍然有效。

我认为一个很好的选择可能是使用转换器转换为默认值,如果绑定返回null。我不确定如何默认到另一个绑定值。

退房converters here

+0

在我的情况下,这是我90%的地方+肯定DataContext会在它上面有一个特定的属性,但是我想回到调用'.ToString()'的地方/如果没有。 – tobriand 2017-02-08 13:53:35

1

如果遇到问题,结合空值和PriorityBinding(如摆振指出的),你可以使用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>