首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FallbackValue如何与MultiBinding一起工作?

FallbackValue如何与MultiBinding一起工作?
EN

Stack Overflow用户
提问于 2010-04-19 16:11:45
回答 1查看 7.4K关注 0票数 10

我问是因为它似乎不起作用。

假设我们绑定到以下对象:

代码语言:javascript
复制
public class HurrDurr
{
  public string Hurr {get{return null;}}
  public string Durr {get{return null;}}
}

那么,如果我们对此使用MultiBinding,那么就会显示回退值,对吗?

代码语言:javascript
复制
<TextBlock>
    <TextBlock.Text>                                
        <MultiBinding StringFormat="{}{0} to the {1}"
                        FallbackValue="Not set!  It works as expected!)">
            <Binding Path="Hurr"/>
            <Binding Path="Durr"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

然而,其结果实际上是“to "。即使强制绑定返回DependencyProperty.UnsetValue也不起作用:

代码语言:javascript
复制
<TextBlock xmnlns:base="clr-namespace:System.Windows;assembly=WindowsBase">
    <TextBlock.Text>                                
        <MultiBinding StringFormat="{}{0} to the {1}"
            FallbackValue="Not set!  It works as expected!)">
            <Binding Path="Hurr"
                FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" />
            <Binding Path="Durr"
                FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

TargetNullValue,也曾尝试过同样的做法,这也是一次彻底的失败。

所以看来MultiBinding永远不会使用FallbackValue.这是真的还是我遗漏了什么?

我发现转换器可以返回我需要的UnsetValue:

代码语言:javascript
复制
class MultiValueFailConverter : IMultiValueConverter
{
    public object Convert(
        object[] values, 
        Type targetType, 
        object parameter, 
        System.Globalization.CultureInfo culture)
    {
        if (values == null || 
            values.Length != 2 ||
            values.Any(x=>x == null))
            return System.Windows.DependencyProperty.UnsetValue;
        return values;
    }

    public object[] ConvertBack(
        object value, 
        Type[] targetTypes, 
        object parameter, 
        System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException("Too complex hurt brain.");
    }
}

然而,这似乎是一个肮脏的污秽的黑客。我认为这样的场景将在框架中得到考虑。不过,我在反射镜里什么也找不到。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-09 20:59:44

这是个老生常谈的问题,但可能需要一些解释。

来自FallbackValue documentation

A绑定在以下情况下成功返回一个值:

绑定源的路径解析successfully.

  • The值转换器(如果有的话)能够转换结果值。
  1. 结果值对于绑定目标(目标)属性有效。

如果1和2返回DependencyProperty.UnsetValue,则目标属性设置为FallbackValue的值(如果可用的话)。如果没有FallbackValue,则使用目标属性的默认值。

在提供的示例中,绑定成功地解析为HurrDurr属性。Null是字符串的有效值,这意味着绑定是有效的。

换句话说,当绑定无法返回值时使用FallbackValue,而在提供的示例中,绑定确实提供了一个有效值。

例如,以原始示例为基础的下列每个片段:

示例1

Hurr和Durr属性被正确绑定;null是一个有效值,FallbackValue永远不会被看到。

代码语言:javascript
复制
<TextBlock>
    <TextBlock.Text>
        <MultiBinding FallbackValue="Binding is valid. I will never be seen." StringFormat="{}{0} to the {1}">
            <Binding Path="Hurr" />
            <Binding Path="Durr" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

示例2

Hurr和Durr属性没有正确绑定;将看到FallbackValue。

代码语言:javascript
复制
<TextBlock>
    <TextBlock.Text>
        <MultiBinding FallbackValue="Binding paths are invalid. Look at me." StringFormat="{}{0} to the {1}">
            <Binding Path="xHurr" />
            <Binding Path="xDurr" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

示例3

如果一个绑定路径无效,那么将看到FallbackValue。

代码语言:javascript
复制
<TextBlock>
    <TextBlock.Text>
        <MultiBinding FallbackValue="One binding path is invalid. Look at me." StringFormat="{}{0} to the {1}">
            <Binding Path="xHurr" />
            <Binding Path="Durr" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

例4

与前面的示例一样,绑定是正确的,因此不会使用FallbackValue。此外,用于FallbackValue父级的每个子Binding属性的FallbackValue应该引用要用于MultiBinding的目标属性的FallbackValue,而不是用于子绑定。

代码语言:javascript
复制
<TextBlock xmlns:base="clr-namespace:System.Windows;assembly=WindowsBase">
    <TextBlock.Text>
        <MultiBinding FallbackValue="Binding is valid. I will never be seen." StringFormat="{}{0} to the {1}">
            <Binding FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" Path="Hurr" />
            <Binding FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" Path="Durr" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

例5

即使Binding属性中没有提供路径,绑定仍然有效,因为绑定将使用绑定到的任何对象。

代码语言:javascript
复制
<TextBlock xmlns:base="clr-namespace:System.Windows;assembly=WindowsBase">
    <TextBlock.Text>
        <MultiBinding FallbackValue="Binding is still valid. I will never be seen." StringFormat="{}{0} to the {1}">
            <Binding FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" />
            <Binding FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

例6

最后,如果将转换器添加到任何绑定属性以强制执行UnsetValue,则将看到MultiBinding FallbackValue:

变换器

代码语言:javascript
复制
internal class ForceUnsetValueConverter : IValueConverter
{
    #region Implementation of IValueConverter

    public object Convert( object value, Type targetType, object parameter, CultureInfo culture )
    {
        return DependencyProperty.UnsetValue;
    }

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

    #endregion
}

XAML

代码语言:javascript
复制
<TextBlock>
    <TextBlock.Text>
        <MultiBinding FallbackValue="Binding is valid, but look at me. I'm an UnsetValue." StringFormat="{}{0} to the {1}">
            <Binding Converter="{StaticResource ForceUnset}" Path="Hurr" />
            <Binding Path="Durr" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2668987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档