読者です 読者をやめる 読者になる 読者になる

開発備忘録

WPF(Xaml + C#)の話題を中心に.Net関連についてのブログです。

TimeSpan型のStringFormatの設定

WPF

WPF でTimeSpan 型のプロパティをバインドした際のStringFormat を忘れてハマったのでメモ。
DateTime 型と表記が異なる上にバインドの設定ウィンドウに出てこないので割と忘れます。

<TextBlock Text="{Binding TimeSpan, StringFormat={}{0:hh\\:mm\\:ss\\.fff}, ConverterCulture=ja-jP}" />

コロンなどの記号の前に'\'を2個入れましょう。

ついでなのでDateTime 型のフォーマットと並べてみてみます。

<Window x:Class="MvvmExample.View.Window6"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ViewModel="clr-namespace:MvvmExample.ViewModel"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Title="Window6"
        Width="400"
        Height="350"
        mc:Ignorable="d">
    <Window.DataContext>
        <ViewModel:ViewModelWindow6 />
    </Window.DataContext>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <GroupBox Header="DateTime">
            <StackPanel Orientation="Vertical">
                <StackPanel Margin="0,3" Orientation="Vertical">
                    <TextBlock Margin="0,0,6,0" Text="年月日曜日時分秒ミリ秒" />
                    <TextBlock Text="{Binding DateTime, StringFormat={}{0:yyyy/MM/dd(ddd) hh:mm:ss.fff}, ConverterCulture=ja-jP}" />
                </StackPanel>
                <StackPanel Margin="0,3" Orientation="Vertical">
                    <TextBlock Margin="0,0,6,0" Text="月日" />
                    <TextBlock Text="{Binding DateTime, StringFormat={}{0:MM/dd}, ConverterCulture=ja-jP}" />
                </StackPanel>
                <StackPanel Margin="0,3" Orientation="Vertical">
                    <TextBlock Margin="0,0,6,0" Text="時分" />
                    <TextBlock Text="{Binding DateTime, StringFormat={}{0:hh:mm}, ConverterCulture=ja-jP}" />
                </StackPanel>
            </StackPanel>
        </GroupBox>

        <GroupBox Grid.Row="1" Header="TimeSpan">
            <StackPanel Orientation="Vertical">
                <StackPanel Margin="0,3" Orientation="Vertical">
                    <TextBlock Margin="0,0,6,0" Text="時分秒ミリ秒" />
                    <TextBlock Text="{Binding TimeSpan, StringFormat={}{0:hh\\:mm\\:ss\\.fff}, ConverterCulture=ja-jP}" />
                </StackPanel>
                <StackPanel Margin="0,3" Orientation="Vertical">
                    <TextBlock Margin="0,0,6,0" Text="時分" />
                    <TextBlock Text="{Binding TimeSpan, StringFormat={}{0:hh\\:mm}, ConverterCulture=ja-jP}" />
                </StackPanel>
            </StackPanel>
        </GroupBox>
    </Grid>
</Window>

書いておいてなんですが、値の表現はコンバーターを使ったほうが共通化できていいと思っています。