为什么在Binding中工作的格式字符串不能在MultiBinding中工作?

时间:2011-06-30 21:02:44

标签: wpf xaml data-binding multibinding

我被这个问题所吸引:MultiBinding StringFormat of TimeSpan

如果我定义了以下Binding,其中StartTime的类型为TimeSpan:

<TextBlock Text={Binding Path=StartTime, StringFormat='{}From {0:hh\\:mm}'}" />

上述绑定按预期进行评估。但是,正如原始问题中的场景所示,如果我尝试在MultiBinding中使用相同的格式字符串,则会因格式异常而失败:

<TextBlock>
    <TextBlock.Text>
        <MultiBinding StringFormat="{}From {0:hh\\:mm} to {1:hh\\:mm}">
            <Binding Path="StartTime" />
            <Binding Path="EndTime" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

问题是,有谁知道为什么?这是一个错误还是预期的行为?对我来说,在MultiBinding中获取相同的输出似乎很奇怪,我必须将格式字符串中的“\:”更改为“:”(正如我在回答原始问题时发现的那样)。

1 个答案:

答案 0 :(得分:0)

这似乎是WPF 4中的一个错误,如果不是,它至少是WPF 3.5的一个重大变化。以下面的代码为例:

<Window x:Class="WpfSampleTestBed.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel>
        <TextBlock Text="{Binding Path=StartTime, StringFormat='{}From {0:hh\\:mm}'}" />

        <TextBlock x:Name="textBlock2">
            <TextBlock.Text>
                <MultiBinding StringFormat="{}From {0:hh\\:mm} to {1:hh\\:mm}">
                    <Binding Path="StartTime" />
                    <Binding Path="EndTime" />
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>

        <TextBlock x:Name="textBlock3" Text="Three" />
        <TextBlock x:Name="textBlock4" Text="Four" />

        <TextBlock>
        <TextBlock.Text>
            <MultiBinding StringFormat="Three = {0}, Four = {1}">
                <Binding ElementName="textBlock3" Path="Text" />
                <Binding ElementName="textBlock4" Path="Text" />
            </MultiBinding>
        </TextBlock.Text>
        </TextBlock>
    </StackPanel>

</Window>

背后的代码如下:

using System;
using System.Windows;

namespace WpfSampleTestBed {

    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
            this.DataContext = new Test() {
                StartTime = TimeSpan.FromSeconds(90),
                EndTime = TimeSpan.FromSeconds(100),
            };
        }
    }

    public class Test {
        public TimeSpan StartTime { get; set; }
        public TimeSpan EndTime { get; set; }
    }

}

如果您针对.NET 3.5编译并运行此代码,则输出(即Window内容)将如下所示:

  

从00:01:30
  从00:01:30到00:01:40
  三   四   三=三,四=四

获取完整的示例代码/项目并针对.NET 4运行它,您将获得:

  

从00:01:30
  
  三   四   三=三,四=四

我找到了一个可能相关的bug report,但作者从未回复,因此微软将此问题视为“不可重复”。

因此看起来,根据子绑定的使用方式,StringFormat在.NET 4中可能有效,也可能无效。