FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

WPFのStringFormatによるフォーマット指定

 TextBlock等に値をバインディングする際にStringFormatを使用して表示形式をカスタマイズすることができます。
 いくつか例を紹介します。
public class MainWindowViewModel : ViewModel
{
    public MainWindowViewModel()
    {
        Value = 1234.567;
        Price = 12345;
        Text = "12345";
        Name = "DVD Box";
        Date = DateTime.Today;
    }

    // プロパティの定義は省略
}
 ViewModelではバインディングするプロパティを用意しているだけです。
 プロパティの定義は無駄に長くなるので省略します。
<Window x:Class="StringFormatDemo.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
        xmlns:l="http://schemas.livet-mvvm.net/2011/wpf"
        xmlns:v="clr-namespace:StringFormatDemo.Views"
        xmlns:vm="clr-namespace:StringFormatDemo.ViewModels"
        Title="MainWindow" Height="350" Width="525">
    
    <Window.DataContext>
        <vm:MainWindowViewModel/>
    </Window.DataContext>
    
    <StackPanel>
        <GroupBox Header="数値の表示">
            <StackPanel>
                <TextBlock Text="{Binding Value, StringFormat={}{0:N2}}"/>
                <TextBlock Text="{Binding Value, StringFormat={}{0:N3}}"/>
                <TextBlock Text="{Binding Value, StringFormat={}{0:00000}}"/>
            </StackPanel>
        </GroupBox>
        
        <GroupBox Header="価格の表示">
            <StackPanel>
                <TextBlock Text="{Binding Price, StringFormat={}{0:C}}"/>
                <TextBlock Text="{Binding Price, StringFormat={}{0:C}, ConverterCulture=ja-JP}"/>
                <TextBlock Text="{Binding Price, StringFormat=定価{0:N0}円}"/>
                <TextBlock Text="{Binding Text, StringFormat={}{0:N0}円}"/>
            </StackPanel>
        </GroupBox>
        
        <GroupBox Header="日付の表示">
            <StackPanel>
                <TextBlock Text="{Binding Date}"/>
                <TextBlock Text="{Binding Date, ConverterCulture=ja-JP}"/>
                <TextBlock Text="{Binding Date, StringFormat={}{0:yyyy年MM月dd日 HH:mm:ss}}"/>
            </StackPanel>
        </GroupBox>
        
        <GroupBox Header="マルチバインディング">
            <TextBlock>
                <TextBlock.Text>
                    <MultiBinding StringFormat="商品名:{0} 価格:{1:N0}円">
                        <Binding Path="Name"/>
                        <Binding Path="Price"/>
                    </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </GroupBox>
    </StackPanel>
</Window>
 これを実行すると以下の様になります。
StringFormatDemo.png
 表示形式(StringFormat)にNを指定すると数値として表示されます。(XAMLコードの18, 19行目)
 Nを指定した場合は数値はカンマ区切りで表示されます。
 Nの後の数値は小数点以下を何桁まで表示するかを表しています。
 数値の桁数を0で合わせたい場合は、StringFormatで桁数分の0を指定します。(20行目)

 価格を表示したい場合はStringFormatにCを指定します。(26, 27行目)
 ただし、表示形式をCとしただけだと価格がドル表示になってしまいます。日本円として表示したい場合はカルチャーの指定を行う必要があります。(27行目)
 StringFormatは値の表示形式をカスタマイズするだけでなく、値の前後にテキストを挿入することもできます。(28行目)
 数値フォーマット(N)や価格フォーマット(C)はバインディングする値が数値の場合に有効になります。バインディングしている値が文字列の場合は機能しません。(29行目)

 日付の場合はStringFormatを使わなくても日付表示になります。(35, 36行目)
 日本人になじみのある形式にするには価格と同じでカルチャーの指定が必要です。
 もちろんStringFormatを使用して表示をカスタマイズすることもできます。(37行目)
 この例では時刻まで表示させましたが年月日だけ表示とかもできます。

 最後に、マルチバインディングを利用して複数のプロパティとバインディングする方法です。(41~50行目)
 MultiBinding要素のStringFormatで表示方法を指定します。なぜかMultiBinding要素はインテリセンスの一覧に表示されないので入力する際にちょっと不安になりますが、問題はありません。
 プロパティとのバインディングはMultiBinding要素内でBinding要素を使用して行います。
 
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

カレンダー
11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
全記事表示リンク

全ての記事を表示する

カテゴリ
タグリスト

月別アーカイブ
11  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09 
最新記事
リンク
最新コメント
検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。