为什么在绑定中有效的格式字符串在多重绑定中无效



我对这个问题很感兴趣:TimeSpan 的MultiBinding StringFormat

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

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

上述绑定的计算结果符合预期。然而,正如最初问题中的场景所示,如果我试图在MultiBinding中使用相同格式的字符串,它会失败,并出现FormatException:

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

问题是,有人知道为什么吗?这是错误还是预期行为?我觉得奇怪的是,要在MultiBinding中获得相同的输出,我必须将格式字符串中的"\:"更改为":"(正如我在回答原始问题时发现的那样(。

这似乎是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上编译并运行此代码,输出(即窗口内容(将如下所示:

从00:01:30开始
从00:01:30到00:01:40
三个
四个
三=三,四=四

获取确切的示例代码/项目,并在.NET4上运行它,您会得到:

从00:01:30开始

三个
四个
三=三,四=四

我发现了一个可能相关的错误报告,但作者从未回应,因此微软以"不可复制"为由关闭了该问题。

因此,根据子绑定的使用方式,StringFormat可能在.NET4中工作,也可能不工作。

相关内容

  • 没有找到相关文章

最新更新