【问题标题】:WPF Binding FallbackValue set to BindingWPF 绑定 FallbackValue 设置为绑定
【发布时间】:2010-12-27 07:09:34
【问题描述】:

有没有办法让另一个绑定作为后备值?

我正在尝试做这样的事情:

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

如果有人有其他技巧可以成功,那就太好了。

【问题讨论】:

    标签: wpf data-binding fallback


    【解决方案1】:

    您正在寻找的是称为 PriorityBinding 的东西(this 列表中的#6)

    (来自文章)

    PriorityBinding 的重点是 按顺序命名多个数据绑定 从最可取到最不可取。 这样,如果第一次绑定失败, 为空和/或默认值,另一个 绑定可以代替它。

    例如

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

    【讨论】:

    • 问题是PriorityBinding把空字符串当作绑定成功
    • 来自MSDN:The value DependencyProperty.UnsetValue is not considered a successful return value. - 所以只要在你的绑定上使用一个转换器,如果你的值为空,它会返回该属性。 @Shimmy
    【解决方案2】:

    如果您在绑定到空值和 PriorityBinding 时遇到问题(正如 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】:

      您希望它在什么条件下使用 Fallback 值?您将如何确定绑定失败?即使绑定到空值,绑定仍然有效。

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

      查看converters here

      【讨论】:

      • 在我的情况下,我 90% 以上确信 DataContext 将具有特定属性,但我想回退到调用 .ToString() 哪里/如果它没有't。
      猜你喜欢
      • 2012-11-01
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 2019-01-27
      相关资源
      最近更新 更多