为什么在绑定中可用的格式化字符串在多绑定中不起作用?

4
我很感兴趣这个问题:MultiBinding StringFormat of TimeSpan 如果我定义了以下绑定,其中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获得相同的输出,需要在格式字符串中将“\:”更改为“:”,这似乎很奇怪(正如我在回答原始问题时发现的)。

2
你尝试过链接中被接受的答案所提供的解决方案吗?http://stackoverflow.com/questions/6537595/multibinding-stringformat-of-timespan/6539134#6539134 - Brian Driscoll
1
在您的第一个绑定中,您已将StringFormat指定为Binding MarkupExtension的一部分,并用单引号标记它。在第二个示例中,您通过属性传递它。尝试更改您的第一个示例以使用显式的Binding对象,并以相同的方式传递StringFormat:<TextBlock.Text><Binding Path="StartTime" StringFormat="{}From {0:hh\\:mm}"/></TextBlock.Text>。我猜它不会起作用。通常会出现解析/转义问题,而错误消息通常没有帮助。 - Kent Boogaart
@Brian 我回答了原始问题,但我不知道为什么我的答案是“正确的”,因为我不知道为什么多绑定不能使用绑定的格式字符串? - sellmeadog
@Kent 你可能是对的。我一回到电脑前就会尝试一下。 - sellmeadog
1个回答

0

这似乎是WPF 4中的一个bug,如果不是的话,至少它与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


三=三,四=四

使用完全相同的示例代码/项目并在.NET 4上运行它,您会得到:

从00:01:30开始



三=三,四=四

我找到了一个错误报告,可能与此有关,但作者从未回复,因此Microsoft将该问题关闭为“无法重现”。

因此,看起来取决于子绑定如何使用,StringFormat在.NET 4中可能或可能不起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接