Почему форматная строка, которая работает в Binding, не работает в MultiBinding? - PullRequest
4 голосов
/ 01 июля 2011

Меня заинтриговал этот вопрос: 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, я должен изменить «\:» на «:» в строке формата (как я обнаружил, отвечая на оригинальный вопрос).

1 Ответ

0 голосов
/ 01 июля 2011

Похоже, что это ошибка в 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.

...