これはWPF4のバグのようですが、少なくともWPF3.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; }
}
}
このコードを.NET3.5に対してコンパイルして実行すると、出力(つまり、ウィンドウコンテンツ)は次のようになります。
00:01:30
から00:01:30から00:01:40まで
スリーフォースリー
=スリー、フォー=
フォー
正確なサンプルコード/プロジェクトを取得し、それを.NET4に対して実行すると次のようになります。
00:01:30から
スリーフォースリー
=スリー、フォー=
フォー
関連する可能性のあるバグレポートを1つ見つけましたが、作成者が応答しなかったため、Microsoftはこの問題を「再現性がない」としてクローズしました。
したがって、子バインディングの使用方法に応じて、StringFormatが.NET4で機能する場合と機能しない場合があります。