最近DependencyObjectとか地味な部分(でも好きな部分)ばっかりやってきた。
ここいらへんで、WPFの本領?を発揮するデータを画面に表示する部分についてやってみようと思う。
とりあえず、例としてお手軽なPersonクラスを作って見るところからスタート!
namespace WpfTemplate
{
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
}
}
面白くも何とも無いけど、年齢と名前を持った人クラスを定義する。
次に、このクラスを表示するためのコントロールを画面に配置する。
使うコントロールは、ContentControlにしてみる。
XAML側からデータを指定してもいいけど、プログラム書くほうが好きなんでコード側からデータを指定する。
using System.Windows;
namespace WpfTemplate
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
personView.Content = new Person { Name = "大田 一希", Age = 27 };
}
}
}
実行すると、下みたいな味気ない画面が出てくる。
デフォだと、ContentControlはToStringしたものを表示してくれるみたい。(厳密にはTextBlockとか作ってるみたいだけど)
これだと味気なさ過ぎるので、Personクラスの見た目を整えてあげようと思う。
最終目標としては、「大田 一希さん 27歳」と表示させる!
一番素直?でWindowsFormsとかでやってた方法だと下みたいなコードになる。
using System.Windows;
namespace WpfTemplate
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
var p = new Person { Name = "大田 一希", Age = 27 };
personView.Content = string.Format("{0}さん {1}歳", p.Name, p.Age);
}
}
}
コード内で、オブジェクトを表示のための表現のstringへ変換してコントロールへセットする。
WPFでは、DataTemplateというのを使ってデータをどう表示するかっていうのが定義できるようになってる。
DataTemplateでさっきと同等の表示をさせてみる。
7行目~14行目がDataTemplateの定義になる。DataTypeでPersonクラスのDataTemplateだということを指定して、中身でどのように表示するかを書いてる。
今回の例では、TextBlockを水平に4つ並べて 「Nameさん Age歳」を表示させるって指定してる。
17行目で、ContentControlのContentTemplateに、さっき作ったDataTemplateを設定している。
C#のコードのほうからは、PersonクラスのオブジェクトをStringに変換する処理を取り除く。
using System.Windows;
namespace WpfTemplate
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
var p = new Person { Name = "大田 一希", Age = 27 };
personView.Content = p;
}
}
}
実行すると、さっきと同じになる。
DataTemplateを使うことで、記述量が増えてめんどくさい雰囲気をかもし出してる。
ということで、データを用意するのはC#のコード、データをどう表現するかはDataTemplateという感じに分離できてる臭い。さらに、personViewのContentに入っているのはPersonオブジェクトだから、後でデータを取り出しやすくなってる。
文字列にしてしまうと、後でパースするとか別管理しないといけないのがめんどくさい。
# 追記
# Windows Live WriterでアップしたものをWebの方で編集すると、どうもおかしくなる…
# XMLの部分が全部大文字に…しかも直すのは至難の業orz