我对这个问题很感兴趣:MultiBinding StringFormat of TimeSpan
如果我定义了以下绑定(bind),其中 StartTime 的类型为 TimeSpan:
<TextBlock Text={Binding Path=StartTime, StringFormat='{}From {0:hh\\:mm}'}" />
上述绑定(bind)按预期进行评估。但是,正如原始问题中的场景所示,如果我尝试在 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 编译并运行此代码,则输出(即窗口内容)将如下所示:
获取确切的示例代码/项目并针对 .NET 4 运行它,您将得到:
我发现了一个可能相关的 bug report,但作者从未回应,因此 Microsoft 将该问题关闭为“不可重现”。
因此,根据子绑定(bind)的使用方式,StringFormat 可能会或可能不会在 .NET 4 中工作。
关于wpf - 为什么在 Binding 中工作的格式字符串在 MultiBinding 中不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6541067/