【问题标题】:Why does a format string that works in a Binding not work in a MultiBinding?为什么在 Binding 中有效的格式字符串在 MultiBinding 中无效?
【发布时间】:2011-06-30 21:02:43
【问题描述】:

我对这个问题很感兴趣: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 中获得相同的输出,我必须将格式字符串中的“\:”更改为“:”(正如我在回答原始问题时发现的那样)。

【问题讨论】:

  • 您是否尝试过您链接到的问题的已接受答案中提供的解决方案? stackoverflow.com/questions/6537595/…
  • 在您的第一个绑定中,您已将StringFormat 指定为Binding MarkupExtension 的一部分,并用单引号将其标出。在第二个示例中,您通过属性传递它。尝试将您的第一个示例更改为使用显式的Binding 对象并以相同的方式传入StringFormat&lt;TextBlock.Text&gt;&lt;Binding Path="StartTime" StringFormat="{}From {0:hh\\:mm}"/&gt;&lt;/TextBlock.Text&gt;。我猜它不会起作用。某种解析/转义问题,通常会出现无用的错误消息。
  • @Brian 我回答了最初的问题,但我不知道为什么我的答案是“正确的”,因为我不知道为什么多重绑定不能使用绑定的格式字符串?
  • @Kent 你可能是对的。我一回到电脑前就试试。

标签: wpf xaml data-binding multibinding


【解决方案1】:

这似乎是 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


三 = 三,四 = 四

获取确切的示例代码/项目并针对 .NET 4 运行它:

从 00:01:30



三 = 三,四 = 四

我发现了一个可能相关的bug report,但作者从未回复,因此 Microsoft 将该问题关闭为“不可重现”。

因此,根据子绑定的使用方式,StringFormat 可能会或可能不会在 .NET 4 中工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    相关资源
    最近更新 更多