【问题标题】:Multiple Binding targets if one value is null如果一个值为空,则为多个绑定目标
【发布时间】:2016-01-14 09:15:39
【问题描述】:

我想将Textblock.Text 绑定到我已经完成的类属性,但是当这个值为 null 时,我想使用一个新属性,如果它为 null,那么默认值被设置。我以为这就是 PriorityBinding 的用途?

<TextBlock.Text>
    <PriorityBinding>
            <Binding Path="Property1"/>
            <Binding Path="Property2"/>
            <Binding Source="---"/>
    </PriorityBinding>
</TextBlock.Text>

【问题讨论】:

  • 这只是一个建议,我没有试过它是否有效,但你可以尝试使用样式和触发器,所以如果 Property1 value = null,那么有一个 setter,将文本绑定设置为 property2

标签: c# wpf xaml binding


【解决方案1】:

null 是 Textblock.Text 属性的有效值,因此它永远不会使用任何其他绑定。

来自MSDN:

PriorityBinding 允许您关联绑定目标(target)属性 带有绑定列表。第一个返回值的绑定 成功成为活动绑定。

如果满足以下条件,则绑定成功返回值:

  1. 绑定源的路径解析成功。

  2. 值转换器(如果有)能够转换结果值。

  3. 结果值对目标属性有效。

值 DependencyProperty.UnsetValue 不被认为是成功的 返回值。


你可以添加一个绑定转换器,当属性值为null时返回DependencyProperty.UnsetValue:

public class NullValueConverter : IValueConverter
{
    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value ?? DependencyProperty.UnsetValue;
    }
    ...
}

【讨论】:

  • DependencyProperty.UnsetValue 是您无法从字符串属性返回的东西,这是我们通常用于Text 属性的绑定类型。
  • @SriramSakthivel 是正确的。 DependencyProperty.UnsetValue 是一个不是字符串的有效返回类型的对象。所以问题仍然存在。
  • 我猜“正确”的方法是使用绑定转换器。查看我的编辑。
  • 是的,转换器是要走的路。正要写和回答。不是没有必要像你已经拥有的那样做。我会把它写成return value ?? DependencyProperty.UnsetValue;
【解决方案2】:

抛出异常将导致属性无法解析,从而允许PriorityBinding 过滤到下一个绑定。

【讨论】:

  • 来自 Exception Throwing 上的 MSDN 文章:不要对正常的控制流使用异常...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 2019-02-25
  • 2015-02-13
  • 2014-03-05
  • 1970-01-01
  • 2018-11-02
  • 2012-05-11
相关资源
最近更新 更多