Похоже, что это ошибка в 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
Три
Четыре
Три = Три, Четыре = Четыре
Я нашел один отчет об ошибке , который может быть связан, но автор так и не ответил, поэтому Microsoft закрыла вопрос как «Не воспроизводимый».
Похоже, что в зависимости от того, как используются дочерние привязки, StringFormat может работать или не работать в .NET 4.