4

私はこの質問に興味をそそられました:TimeSpanのMultiBindingStringFormat

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で同じ出力を取得するには、フォーマット文字列の「\:」を「:」に変更する必要があるのは奇妙に思えます(元の質問に答えたときに発見したように)。

4

1 に答える 1

0

これは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で機能する場合と機能しない場合があります。

于 2011-07-01T02:41:23.883 に答える