【问题标题】:MultiBinding Fallback value on unsetvalue在 unsetvalue 上的 MultiBinding 后备值
【发布时间】:2013-05-30 05:37:25
【问题描述】:

如果多重绑定中的任何绑定失败,我正在寻找一种方法来指定回退值。

这是绑定成功的情况(即A和B是有效路径)

<MultiBinding Converter="{local:MultiConverter}">
    <Binding Path="A"/>
    <Binding Path="B"/>
</MultiBinding>

这里是失败的情况('B'的路径被破坏)

<MultiBinding Converter="{local:MultiConverter}">
    <Binding Path="A"/>
    <Binding Path="Bb"/>
</MultiBinding>

为转换器的 value[1] 传入 {DependencyProperty.UnsetValue} 的值。我希望我可以做以下事情:

<MultiBinding Converter="{local:MultiConverter}" FallbackValue="Egg">
    <Binding Path="A"/>
    <Binding Path="Bb"/>
</MultiBinding>

但不幸的是,转换器仍然使用未设置的值调用。

虽然我知道您可以执行以下操作

<MultiBinding Converter="{local:MultiConverter}">
    <Binding Path="A"/>
    <Binding Path="Bb" FallbackValue="Egg"/>
</MultiBinding>

这不是我想要的。如果任何子绑定失败,我想将整个多重绑定的后备指定为 X。我不想为每个组件指定一个后备。

目前,我采用以下方法,...但我想指定多绑定的后备,而不是转换器。

public class MultiConverter : MarkupExtension, IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.Any(e => e == DependencyProperty.UnsetValue))
        {
            return "failed!";
        }
        return values[0].ToString() + values[1].ToString();
    }

    public object[] ConvertBack(object values, Type[] targetType, object parameter, CultureInfo culture)
    {
        return null;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

【问题讨论】:

    标签: wpf converter multibinding fallback


    【解决方案1】:

    也许使用TargetNullValue 从转换器返回null 而不是"failed!"

    <MultiBinding Converter="{local:MultiConverter}" TargetNullValue="Failed!">
        <Binding Path="A"/>
        <Binding Path="Bb" />
    </MultiBinding>
    

    这样您在转换器中进行检查,如果转换器由于任何绑定错误而返回null,您的结果将选择TargetNullvalue

    【讨论】:

    • 但这仍然意味着我必须检查 MultiConverter 中未设置的值。这不是一个大问题,因为我可以将该代码放在所有转换器的公共基类中,但似乎已经完成了一些事情,而且我只是在错误地使用它。
    • @pastillman 是的,您确实需要在转换器中检查它,因为您在那里“全局”地检查所有传入的values[i]。否则,正如您提到的,您可以在每个绑定的基础上执行此操作,或者如果您根本不想传递无效绑定,请使用 PriorityBinding。让转换器返回 null 是完全有效的,因为它还有助于本地化,您可以直接从 xaml 引用字符串。
    猜你喜欢
    • 2011-03-09
    • 2014-08-15
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2012-11-22
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多