<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C#</title><link>http://blogs.wankuma.com/kazuki/category/1421.aspx</link><description>C#</description><managingEditor>kazuki@wankuma.com (かずき)</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[WPF][C#]TemplateBindingとBindingのRelativeSource TemplatedParentの違い</title><link>http://blogs.wankuma.com/kazuki/archive/2008/09/04/155536.aspx</link><pubDate>Thu, 04 Sep 2008 20:28:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/09/04/155536.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/155536.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/09/04/155536.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/155536.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/155536.aspx</trackback:ping><description>&lt;p&gt;WPFのControlTemplateとかで使えるBindingの特殊な書き方にTemplateBindingというものがある。こいつは、プロパティ名を受け取るだけのシンプルなもの。&lt;br&gt;TemplateBindingを使わなくても、BindingのRelativeSourceに{RelativeSource TemplatedParent}を指定することで、TemplateBindingと同じような動きをさせることが出来る。&lt;br&gt;ただし、使ってみると微妙に動きが違うことに気づいた。今まではTemplateBindingを使うと楽チンくらいにしか思ってなかったけど、違いを明らかにするために、いくつか実験をしてみようと思う。&lt;/p&gt; &lt;p&gt;とりあえず、実験するためにカスタムコントロールを１つこさえる。Controlを継承して、Textプロパティを定義しただけのシンプルなコントロール。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:878ecee2-770e-4ee0-864d-8cde5e42ddc7" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;using System.Windows;
using System.Windows.Controls;

namespace WpfComboBoxStudy
{
    // TextBoxもどきコントロール
    public class CustomControl : Control
    {
        static CustomControl()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl), new FrameworkPropertyMetadata(typeof(CustomControl)));
        }

        #region Textプロパティ
        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register(
                "Text", 
                typeof(string), 
                typeof(CustomControl), 
                new UIPropertyMetadata(null));
        #endregion

    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Generic.xaml側はこんな感じ。TextBoxを置いて、TemplateBindingを使ってTextBoxのTextプロパティとCustomControlのTextプロパティをバインドしている。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:f15be6de-1a3c-4315-aa49-02a5b67a94cc" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfComboBoxStudy"&amp;gt;
    &amp;lt;Style TargetType="{x:Type local:CustomControl}"&amp;gt;
        &amp;lt;Setter Property="Template"&amp;gt;
            &amp;lt;Setter.Value&amp;gt;
                &amp;lt;ControlTemplate TargetType="{x:Type local:CustomControl}"&amp;gt;
                    &amp;lt;!-- TemplateBinding!!!! --&amp;gt;
                    &amp;lt;TextBox Text="{TemplateBinding Text}" /&amp;gt;
                &amp;lt;/ControlTemplate&amp;gt;
            &amp;lt;/Setter.Value&amp;gt;
        &amp;lt;/Setter&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/ResourceDictionary&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;このコントロールを、WindowにおいてTextプロパティにHello worldを設定する。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:1e2c8495-95bc-4c96-bf42-7467626e7849" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Window x:Class="WpfComboBoxStudy.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfComboBoxStudy"
    Title="Window1" Height="300" Width="300"&amp;gt;
    &amp;lt;StackPanel&amp;gt;
        &amp;lt;local:CustomControl x:Name="customControl" Text="Hello world" /&amp;gt;
    &amp;lt;/StackPanel&amp;gt;
&amp;lt;/Window&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;これを実行すると、TextBoxにHello worldと表示される素敵な画面が出来上がる。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFCTemplateBindingBindingRelativeSource_11FB1/image.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="75" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFCTemplateBindingBindingRelativeSource_11FB1/image_thumb.png" width="218" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;さて、ここで１つ問題が出てくる。問題を明らかにするためにボタンを１つ置いてClickイベントでCustomControlのTextプロパティをMessageBoxで表示するようにしてみた。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:fcf71dc6-f327-45ca-8016-67882d9f6822" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Window x:Class="WpfComboBoxStudy.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfComboBoxStudy"
    Title="Window1" Height="300" Width="300"&amp;gt;
    &amp;lt;StackPanel&amp;gt;
        &amp;lt;local:CustomControl x:Name="customControl" Text="Hello world" /&amp;gt;
        &amp;lt;!-- ↓こいつね！！！↓ --&amp;gt;
        &amp;lt;Button Content="Alert" Click="Alert" /&amp;gt;
    &amp;lt;/StackPanel&amp;gt;
&amp;lt;/Window&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d75cc87a-4864-4865-93a4-85627387948b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;using System.Windows;

namespace WpfComboBoxStudy
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Alert(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(customControl.Text);
        }

    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;これを実行してみると、ちょっとした問題にぶちあたる。実行直後にボタンを押すと期待通りの値になる。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFCTemplateBindingBindingRelativeSource_11FB1/image_3.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFCTemplateBindingBindingRelativeSource_11FB1/image_thumb_3.png" width="241" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;ただし、TextBoxの中身を書き換えてボタンを押すと…&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFCTemplateBindingBindingRelativeSource_11FB1/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFCTemplateBindingBindingRelativeSource_11FB1/image_thumb_4.png" width="191" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;ばっちり値が反映されてない。つまり、ターゲットからソースへの書き戻しが行われない。&lt;br&gt;ソースからターゲットへの書き戻しは普通に動く。試してみよう。&lt;/p&gt;
&lt;p&gt;もう１つボタンを置く。&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:7da77b05-3807-443f-8ca8-2963ab6699df" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Window x:Class="WpfComboBoxStudy.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfComboBoxStudy"
    Title="Window1" Height="300" Width="300"&amp;gt;
    &amp;lt;StackPanel&amp;gt;
        &amp;lt;local:CustomControl x:Name="customControl" Text="Hello world" /&amp;gt;
        &amp;lt;Button Content="Alert" Click="Alert" /&amp;gt;
        &amp;lt;!-- ↓足したのはこいつね！！！↓ --&amp;gt;
        &amp;lt;Button Content="Update Source" Click="UpdateSource" /&amp;gt;
    &amp;lt;/StackPanel&amp;gt;
&amp;lt;/Window&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;そして、イベントハンドラでcustomControlのTextプロパティの値を更新する処理を書く。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:8a9b1788-dddd-42e6-be53-7ff07c2687f1" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;private void UpdateSource(object sender, RoutedEventArgs e)
{
    customControl.Text = "筋肉が落ちていく";
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;これを実行して、Update Sourceボタンを押すと…&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFCTemplateBindingBindingRelativeSource_11FB1/image_5.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="123" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFCTemplateBindingBindingRelativeSource_11FB1/image_thumb_5.png" width="222" border="0"&gt;&lt;/a&gt; ぽちっとな&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFCTemplateBindingBindingRelativeSource_11FB1/image_6.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="127" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFCTemplateBindingBindingRelativeSource_11FB1/image_thumb_6.png" width="220" border="0"&gt;&lt;/a&gt;&lt;br&gt;ソースからターゲットへ、値の更新がばっちり反映されている。&lt;/p&gt;
&lt;p&gt;ということで、TemplateBindingは一方通行なのでした。Bindingを使うと…&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:14d450b9-4582-49c8-817f-672db8e11adf" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfComboBoxStudy"&amp;gt;
    &amp;lt;Style TargetType="{x:Type local:CustomControl}"&amp;gt;
        &amp;lt;Setter Property="Template"&amp;gt;
            &amp;lt;Setter.Value&amp;gt;
                &amp;lt;ControlTemplate TargetType="{x:Type local:CustomControl}"&amp;gt;
                    &amp;lt;!-- Binding!!!! --&amp;gt;
                    &amp;lt;TextBox Text="{Binding Path=Text,
                                            RelativeSource={RelativeSource TemplatedParent}}" /&amp;gt;
                &amp;lt;/ControlTemplate&amp;gt;
            &amp;lt;/Setter.Value&amp;gt;
        &amp;lt;/Setter&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/ResourceDictionary&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;テキストボックスを編集してAlertを押してみると、ちゃんとCustomControlのTextプロパティが書き換わってる。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFCTemplateBindingBindingRelativeSource_11FB1/image_7.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFCTemplateBindingBindingRelativeSource_11FB1/image_thumb_7.png" width="244" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;もちろんUpdateSourceボタンを押したときの動作もOK。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFCTemplateBindingBindingRelativeSource_11FB1/image_8.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="111" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFCTemplateBindingBindingRelativeSource_11FB1/image_thumb_8.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;ということで簡単にまとめ。&lt;/p&gt;
&lt;p&gt;TemplateBindingはソースからターゲットへの一方通行。&lt;br&gt;細かな制御をしたければ{Binding RelativeSource={RelativeSource TemplatedParent}, ....}を使おう。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/155536.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[WPF][C#]BindingGroupを使ってみる　その２</title><link>http://blogs.wankuma.com/kazuki/archive/2008/08/28/154581.aspx</link><pubDate>Thu, 28 Aug 2008 22:10:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/08/28/154581.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/154581.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/08/28/154581.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/154581.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/154581.aspx</trackback:ping><description>&lt;p&gt;その１：&lt;a title="http://blogs.wankuma.com/kazuki/archive/2008/08/14/153008.aspx" href="http://blogs.wankuma.com/kazuki/archive/2008/08/14/153008.aspx"&gt;http://blogs.wankuma.com/kazuki/archive/2008/08/14/153008.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;.NET Framework 3.5 SP1で追加されたBindingGroupというクラス。&lt;br&gt;こいつは、結構使いでがあるんじゃないかと思ってる。正統派な使い方ではないのかもしれないけど、上手に使えばINotifyPropertyChangedインターフェースとか実装しなきゃいけないパターンが減るかもしれない。ということで実験。&lt;/p&gt; &lt;p&gt;まずは、Personクラスを作る。INotifyPropertyChangedは実装せずに、普通にプロパティを定義するだけ。定義するプロパティは、いつも通りNameとAgeの２つにした。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:67c829ba-347e-4bf9-833b-92ccfa647fd3" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;namespace WpfBindingGroupTest
{
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;これをWindowのDataContextへ設定する。最近はコードから設定するよりも、XAMLから設定するほうがお試しのときは楽なように感じてきだした。最初はコードからじゃないと嫌だったんだけど、慣れって恐ろしいわ。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6161f58c-6c61-4f0a-8e52-2d587cd21745" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c"&gt;&amp;lt;Window x:Class="WpfBindingGroupTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfBindingGroupTest"
    Title="Window1" Height="300" Width="300"
    DataContext="{DynamicResource tanaka}"&amp;gt;
    &amp;lt;Window.Resources&amp;gt;
        &amp;lt;local:Person x:Key="tanaka" Name="田中　太郎" Age="50" /&amp;gt;
    &amp;lt;/Window.Resources&amp;gt;
    &amp;lt;Window.BindingGroup&amp;gt;
        &amp;lt;BindingGroup /&amp;gt;
    &amp;lt;/Window.BindingGroup&amp;gt;
    &amp;lt;StackPanel&amp;gt;
        &amp;lt;TextBlock Text="名前" /&amp;gt;
        &amp;lt;TextBox Text="{Binding Name}" /&amp;gt;
        &amp;lt;TextBlock Text="年齢" /&amp;gt;
        &amp;lt;TextBox Text="{Binding Age}" /&amp;gt;
        &amp;lt;Button Content="Update Source" Click="UpdateSource_Click" /&amp;gt;
        &amp;lt;Button Content="Source To Target" Click="SourceToTarget_Click" /&amp;gt;
    &amp;lt;/StackPanel&amp;gt;
&amp;lt;/Window&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;ついでに、適当に画面を組み立てておいた。実行すると見た目はこんな感じ。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFCBindingGroup_1377F/image.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="144" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFCBindingGroup_1377F/image_thumb.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;WindowのDataContextにPersonの田中　太郎さん50歳を設定する。そして、テキストボックスに名前と年齢をそれぞれバインドしておいた。BindingGroupをWindowに設定してWindow以下のBindingをさくっとグルーピング。Update Sourceは、CommitEditを呼んでPersonオブジェクトへテキストボックスの中身を書き戻す。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:941286e3-2d9c-4f2f-becd-5a8e2bbaad4b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;private void UpdateSource_Click(object sender, RoutedEventArgs e)
{
    // 変更を反映
    BindingGroup.CommitEdit();
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h1&gt;ついに本題&lt;/h1&gt;
&lt;p&gt;さて、PersonクラスはINotifyPropertyChangedを実装していないので、Personオブジェクトの中身が書き換えられてもTextBoxの値って書き換わらない。もし、Personクラスの中身をTextBoxへ反映させようと思ったらName用のBindingとAge用のBindingすべてに対してメソッド呼び出しをして回らないといけなかったと思う。&lt;/p&gt;
&lt;p&gt;BindingGroupを使うと、これがイッパツで出来るようになる。つまり、楽チンってこと。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b0ef9eb4-afa9-419f-8659-9704490e99e9" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;private void SourceToTarget_Click(object sender, RoutedEventArgs e)
{
    // リソースからPersonオブジェクトを取得して
    var tanaka = (Person)FindResource("tanaka");
    // データを初期化して
    tanaka.Name = "田中　太郎";
    tanaka.Age = 50;
    // TextBoxのほうへ反映
    BindingGroup.CancelEdit();
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;これで、どんなときもボタンを押すと「田中　太郎さん50歳」のデータが画面に出るようになる。INotifyPropertyChangedインターフェースだと、いっぱいプロパティを書き換えると、そのつど更新処理が走ってたけど、BindingGroupを使うことで、ここらへんを一まとめにしてドカーンと行えるようになる。&lt;/p&gt;
&lt;p&gt;ありがたやありがたや。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/154581.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[WPF][C#]CheckedListBoxを作ろう　その２</title><link>http://blogs.wankuma.com/kazuki/archive/2008/08/27/154461.aspx</link><pubDate>Wed, 27 Aug 2008 20:54:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/08/27/154461.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/154461.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/08/27/154461.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/154461.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/154461.aspx</trackback:ping><description>&lt;p&gt;昨日のエントリは、だめっぷりを発揮してしまった。&lt;br&gt;&lt;a title="http://blogs.wankuma.com/kazuki/archive/2008/08/27/154403.aspx" href="http://blogs.wankuma.com/kazuki/archive/2008/08/27/154403.aspx"&gt;http://blogs.wankuma.com/kazuki/archive/2008/08/27/154403.aspx&lt;/a&gt;&lt;/p&gt; &lt;h1&gt;だめっぷりその１&lt;/h1&gt; &lt;p&gt;ListBoxにStringを突っ込むときはユニークな文字列を突っ込まないと、いやんな動きをすることがある。&lt;br&gt;知ってるので、全部データを変えて入れてたけど、知らない人が見ることもあるので、書いておくべきだった。&lt;/p&gt; &lt;p&gt;ちなみに、どういう動きをするのかというと…&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFCCheckedListBox_125AD/image.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="135" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFCCheckedListBox_125AD/image_thumb.png" width="244" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;上のように田中　太郎さんが三人いて、３つ選択した状態でDumpボタンを押すと…&lt;/p&gt; &lt;p&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFCCheckedListBox_125AD/image_3.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="181" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFCCheckedListBox_125AD/image_thumb_3.png" width="158" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;田中　太郎が３つ表示されるのではなく、１つしか表示されない。&lt;br&gt;さらに、上のように３つの田中　太郎をチェックした状態でどれかのチェックを１つ外すと…&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFCCheckedListBox_125AD/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="135" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFCCheckedListBox_125AD/image_thumb_4.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;あれ？2個チェックが消えた？？といった動きをするのです。&lt;/p&gt; &lt;h1&gt;だめっぷりその２&lt;/h1&gt; &lt;p&gt;下のような事を書いてたけど真っ赤なうそだった。&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;ListBoxItemの選択状態は、添付プロパティのSelector.IsSelectedで管理されている。ListBoxItem自体にはIsSelectedといったプロパティは定義されてないといった有様だ。&lt;br&gt;直感的ではないが、まぁ仕方ないのだろう。分離分離。&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;ListBoxItemに普通にあります。IsSelectedプロパティ。申し訳ないです。&lt;br&gt;ということなので、XAMLのCheckBoxの所のBindingも変わって下のような形でOK。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:f56a019b-b561-45d8-9767-618dfbbe4fd2" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;CheckBox Content="{TemplateBinding Content}"  
          IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsSelected}"/&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;IsCheckedのBindingのPathが(Selector.IsSelected)だったけど、普通にIsSelectedで大丈夫。&lt;/p&gt;
&lt;p&gt;ふぅ。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/154461.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[WPF][C#]CheckedListBoxを作ろう</title><link>http://blogs.wankuma.com/kazuki/archive/2008/08/27/154403.aspx</link><pubDate>Wed, 27 Aug 2008 00:07:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/08/27/154403.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/154403.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/08/27/154403.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/154403.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/154403.aspx</trackback:ping><description>&lt;p&gt;ということで、CheckedListBoxを作ってみようと思う。&lt;br&gt;基本的に、ListBoxの中身の１つの要素の実態のListBoxItemってやつのTemplateをCheckBoxに差し替えるだけで見た目は完成する。&lt;/p&gt; &lt;p&gt;ということで作っていこう。&lt;/p&gt; &lt;h1&gt;普通にListBoxを作成&lt;/h1&gt; &lt;p&gt;いつもならPersonクラスを作って…とかになるんだけど、今回はめんどくさいのでSystem.StringをそのままListBoxの要素として指定するようにした。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:bad4b58b-0e2e-4516-87c2-b1a7d10461fe" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Window x:Class="WpfCheckedListBox.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    Title="Window1" Height="300" Width="300"&amp;gt;
    &amp;lt;StackPanel&amp;gt;
        &amp;lt;ListBox Name="listBox"&amp;gt;
            &amp;lt;System:String&amp;gt;田中　太郎&amp;lt;/System:String&amp;gt;
            &amp;lt;System:String&amp;gt;田中　次郎&amp;lt;/System:String&amp;gt;
            &amp;lt;System:String&amp;gt;田中　三郎&amp;lt;/System:String&amp;gt;
            &amp;lt;System:String&amp;gt;田中　四郎&amp;lt;/System:String&amp;gt;
            &amp;lt;System:String&amp;gt;田中　五郎&amp;lt;/System:String&amp;gt;
        &amp;lt;/ListBox&amp;gt;
        &amp;lt;Button Content="Dump" Click="Button_Click" /&amp;gt;
    &amp;lt;/StackPanel&amp;gt;
&amp;lt;/Window&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;ボタンのクリックイベントには、現在選択中の要素の値をメッセージボックスに表示する処理を書いておいた。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:631c6579-e47b-4d08-93c4-c279abac846e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;using System;
using System.Text;
using System.Windows;

namespace WpfCheckedListBox
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // 選択中の要素をつなげてメッセージボックスに表示
            var sb = new StringBuilder();
            foreach (var item in listBox.SelectedItems)
            {
                sb.AppendLine((String) item);
            }
            MessageBox.Show(sb.ToString());
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;これを実行すると、おそらく予想通りの結果になる。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="133" alt="image" src="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image_thumb.png" width="244" border="0"&gt;&lt;/a&gt; 田中　三郎を選択した状態でボタンを押すと…&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image_3.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="181" alt="image" src="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image_thumb_3.png" width="158" border="0"&gt;&lt;/a&gt; 田中　三郎が表示される。&lt;/p&gt;
&lt;p&gt;現状複数選択は出来ないが、ListBoxのSelectionModeをMultipleにしておくと、複数選択にも対応できる。CheckedListBoxの動き的には、複数選択できるほうがしっくりくると思うので、Multipleに設定しておこうと思う。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6c021192-e15a-4220-94a6-8ac16a422431" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;ListBox Name="listBox" SelectionMode="Multiple"&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="134" alt="image" src="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image_thumb_4.png" width="244" border="0"&gt;&lt;/a&gt; 複数選択も可能。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image_5.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="217" alt="image" src="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image_thumb_5.png" width="158" border="0"&gt;&lt;/a&gt; ボタンを押したときの動作もばっちり。&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;h1&gt;CheckBox化してみよう&lt;/h1&gt;
&lt;p&gt;見た目をCheckBoxに差し替えてみようと思う。ListBoxに、ItemContainerStyleというプロパティがあるので、そこにStyleを設定するとListBoxItemにStyleを指定できる。StyleからTemplateをCheckBoxに変えるようにカキカキ。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:2dabf429-424e-419d-82dd-efb6dd4350b0" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Window x:Class="WpfCheckedListBox.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    Title="Window1" Height="300" Width="300"&amp;gt;
    &amp;lt;StackPanel&amp;gt;
        &amp;lt;ListBox Name="listBox" SelectionMode="Multiple"&amp;gt;
            &amp;lt;!-- ContainerStyle --&amp;gt;
            &amp;lt;ListBox.ItemContainerStyle&amp;gt;
                &amp;lt;Style TargetType="{x:Type ListBoxItem}"&amp;gt;
                    &amp;lt;Setter Property="Template"&amp;gt;
                        &amp;lt;Setter.Value&amp;gt;
                            &amp;lt;ControlTemplate TargetType="{x:Type ListBoxItem}"&amp;gt;
                                &amp;lt;!-- CheckBoxに見た目を差し替えてContentをバインドする --&amp;gt;
                                &amp;lt;CheckBox Content="{TemplateBinding Content}"/&amp;gt;
                            &amp;lt;/ControlTemplate&amp;gt;
                        &amp;lt;/Setter.Value&amp;gt;
                    &amp;lt;/Setter&amp;gt;
                &amp;lt;/Style&amp;gt;
            &amp;lt;/ListBox.ItemContainerStyle&amp;gt;
            &amp;lt;System:String&amp;gt;田中　太郎&amp;lt;/System:String&amp;gt;
            &amp;lt;System:String&amp;gt;田中　次郎&amp;lt;/System:String&amp;gt;
            &amp;lt;System:String&amp;gt;田中　三郎&amp;lt;/System:String&amp;gt;
            &amp;lt;System:String&amp;gt;田中　四郎&amp;lt;/System:String&amp;gt;
            &amp;lt;System:String&amp;gt;田中　五郎&amp;lt;/System:String&amp;gt;
        &amp;lt;/ListBox&amp;gt;
        &amp;lt;Button Content="Dump" Click="Button_Click" /&amp;gt;
    &amp;lt;/StackPanel&amp;gt;
&amp;lt;/Window&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;これで実行すると、見た目はばっちり動作はしょんぼりになる。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image_6.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="137" alt="image" src="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image_thumb_6.png" width="244" border="0"&gt;&lt;/a&gt; 見た目は出来てそうだけど…&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image_7.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="165" alt="image" src="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image_thumb_7.png" width="158" border="0"&gt;&lt;/a&gt; ListBoxの選択状態とCheckBoxのチェックが全然連動できてない。&lt;/p&gt;
&lt;p&gt;次は、この問題を解決してみようと思う。&lt;/p&gt;
&lt;h1&gt;ListBoxの選択状態とCheckBoxのチェックの同期&lt;/h1&gt;
&lt;p&gt;ListBoxItemの選択状態は、添付プロパティのSelector.IsSelectedで管理されている。ListBoxItem自体にはIsSelectedといったプロパティは定義されてないといった有様だ。&lt;br&gt;直感的ではないが、まぁ仕方ないのだろう。分離分離。&lt;/p&gt;
&lt;p&gt;ということで、Selector.IsSelectedとCheckBoxのIsCheckedプロパティが同期すればよさそうだ。二つのプロパティの値を同期とるってことは…バインドすればOKです。ということでやってみた。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ddc4f705-591c-4b90-931b-e3034d77072b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;CheckBox Content="{TemplateBinding Content}"
          IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(Selector.IsSelected)}"/&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;IsCheckedは、添付プロパティのSelector.IsSelectedとバインドするため、プロパティ名だけを指定するTemplateBindingではなくて、きちんとBindingでRelativeSourceをTemplatedParentにして使った。Pathは、括弧で囲ってSelector.IsSelectedで１つのプロパティをあらわしていることを明示しないと動かない。&lt;/p&gt;
&lt;p&gt;早速実行してみよう。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image_8.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="137" alt="image" src="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image_thumb_8.png" width="244" border="0"&gt;&lt;/a&gt; 動きは勿論大丈夫。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image_9.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="217" alt="image" src="http://kazuki.wankuma.com/images/2008/04/WPFCCheckedListBox_14A1A/image_thumb_9.png" width="158" border="0"&gt;&lt;/a&gt; 選択状態もばっちりいけてる。&lt;/p&gt;
&lt;h1&gt;最後にStyleに切り出し&lt;/h1&gt;
&lt;p&gt;最後に、再利用可能なようにStyleに切り出しておく。Application.Resourcesあたりに登録して使うといいだろう。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d5621049-e976-4f90-8919-5778abb8fe89" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Style x:Key="CheckedListBoxStyle" TargetType="{x:Type ListBox}"&amp;gt;
    &amp;lt;Setter Property="SelectionMode" Value="Multiple" /&amp;gt;
    &amp;lt;Setter Property="ItemContainerStyle"&amp;gt;
        &amp;lt;Setter.Value&amp;gt;
            &amp;lt;Style TargetType="{x:Type ListBoxItem}"&amp;gt;
                &amp;lt;Setter Property="Template"&amp;gt;
                    &amp;lt;Setter.Value&amp;gt;
                        &amp;lt;ControlTemplate TargetType="{x:Type ListBoxItem}"&amp;gt;
                            &amp;lt;!-- CheckBoxに見た目を差し替えてContentをバインドする --&amp;gt;
                            &amp;lt;CheckBox Content="{TemplateBinding Content}"
                                  IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(Selector.IsSelected)}"/&amp;gt;
                        &amp;lt;/ControlTemplate&amp;gt;
                    &amp;lt;/Setter.Value&amp;gt;
                &amp;lt;/Setter&amp;gt;
            &amp;lt;/Style&amp;gt;
        &amp;lt;/Setter.Value&amp;gt;
    &amp;lt;/Setter&amp;gt;
&amp;lt;/Style&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;使う側はStaticResourceでStyleプロパティに設定するだけでCheckedListBoxとして使えるようになる。&lt;br&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:bf3e3432-2c9c-4a87-b50d-6fe6330c5be7" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;ListBox Name="listBox" Style="{StaticResource CheckedListBoxStyle}"&amp;gt;
    ....省略...
&amp;lt;/ListBox&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;めでたしめでたし。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/154403.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[WPF][C#]カスタムコントロール入門 その１</title><link>http://blogs.wankuma.com/kazuki/archive/2008/08/25/154325.aspx</link><pubDate>Mon, 25 Aug 2008 23:49:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/08/25/154325.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/154325.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/08/25/154325.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/154325.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/154325.aspx</trackback:ping><description>&lt;p&gt;ずっと思ってた。WPFをやり始めたころからずっと。&lt;br&gt;カスタムコントロールコントロールを作りたい！！！ということでコツコツDependencyPropertyとかCommandとかやってきたのが実を結んで、ついにカスタムコントロール作成を入門してみるよ。&lt;/p&gt; &lt;h1&gt;プロジェクトの作成&lt;/h1&gt; &lt;p&gt;WpfMyControlという名前でプロジェクトを作成した。あえて見出しをつけるまでもないけど、はじめを大事にね。&lt;/p&gt; &lt;h1&gt;コントロールの作成&lt;/h1&gt; &lt;p&gt;右クリックメニューからさくっと追加。カスタムコントロール（WPF）っていうのを選ぼう。&lt;br&gt;WPFついてないのを選ぶとWindowsFormのになっちゃうので要注意。&lt;/p&gt; &lt;p&gt;名前はGreetControlにしてみた。コントロールを作成すると、Themes\Generic.xamlとGreetControl.csというファイルが作られる。&lt;/p&gt; &lt;p&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFC_14ED1/image.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="170" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFC_14ED1/image_thumb.png" width="200" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Generic.xamlは、見た目を定義するのに使います。GreetControlに、CommandやDependencyPropertyを定義する。&lt;/p&gt; &lt;h2&gt;今回の目標&lt;/h2&gt; &lt;p&gt;最初に書いておけって感じがしなくもないけど、今回の目標を書いておく。といあえず、テキストボックスとボタンがあって、ボタンを押すと、テキストボックスの中身がメッセージボックスで表示されるものを目指す。&lt;/p&gt; &lt;h2&gt;見た目の作成&lt;/h2&gt; &lt;p&gt;見た目を作っていく。見た目はGeneric.xamlにあるStyleに書いていく。最初の状態だとGeneric.xamlには、下のようなStyleが定義されている。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:63c4fcdc-7f8b-4f0c-89cc-e129888ce28c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfMyControl"&amp;gt;


    &amp;lt;Style TargetType="{x:Type local:GreetControl}"&amp;gt;
        &amp;lt;Setter Property="Template"&amp;gt;
            &amp;lt;Setter.Value&amp;gt;
                &amp;lt;ControlTemplate TargetType="{x:Type local:GreetControl}"&amp;gt;
                    &amp;lt;Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"&amp;gt;
                    &amp;lt;/Border&amp;gt;
                &amp;lt;/ControlTemplate&amp;gt;
            &amp;lt;/Setter.Value&amp;gt;
        &amp;lt;/Setter&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/ResourceDictionary&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;GreetControlをTargetTypeにして、Templateを設定するStyleが定義されているのがわかる。&lt;br&gt;ここにStackPanelを置いて、TextBoxとButtonをとりあえず置いてみた。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b5a1a50a-3f1d-42ed-b02e-9eaef31a7b5b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfMyControl"&amp;gt;


    &amp;lt;Style TargetType="{x:Type local:GreetControl}"&amp;gt;
        &amp;lt;Setter Property="Template"&amp;gt;
            &amp;lt;Setter.Value&amp;gt;
                &amp;lt;ControlTemplate TargetType="{x:Type local:GreetControl}"&amp;gt;
                    &amp;lt;Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"&amp;gt;
                        &amp;lt;StackPanel&amp;gt;
                            &amp;lt;TextBox /&amp;gt;
                            &amp;lt;Button Content="Greet!!" /&amp;gt;
                        &amp;lt;/StackPanel&amp;gt;
                    &amp;lt;/Border&amp;gt;
                &amp;lt;/ControlTemplate&amp;gt;
            &amp;lt;/Setter.Value&amp;gt;
        &amp;lt;/Setter&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/ResourceDictionary&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;ちょっと見た目を弄ったので、Window1.xamlに置いてみる。namespaceを定義してWindowにぽちっと置いてみた。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:006c062f-1147-4bfd-94fd-89c6396341d3" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Window x:Class="WpfMyControl.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfMyControl"
    Title="Window1" Height="300" Width="300"&amp;gt;
    &amp;lt;StackPanel&amp;gt;
        &amp;lt;local:GreetControl /&amp;gt;
    &amp;lt;/StackPanel&amp;gt;
&amp;lt;/Window&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;実行してみると、確かに見た目は出来てる！&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFC_14ED1/image_3.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="78" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFC_14ED1/image_thumb_3.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;次はプロパティを作ってみよう。とりあえず、TextBoxに入力された値を保持するためのプロパティが必要になりそう。ということでプロパティをつくってみようと思う。&lt;/p&gt;
&lt;h2&gt;プロパティの定義&lt;/h2&gt;
&lt;p&gt;プロパティは、普通に依存プロパティで作ることになる。string型のValueプロパティなので、こんな感じでいける。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0ff8c62f-bf7f-42c4-886e-0827bb2e4781" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfMyControl
{
    public class GreetControl : Control
    {

        #region Value 依存プロパティ
        public string Value
        {
            get { return (string)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }

        // GreetControlのstring型のValueプロパティで、デフォルト値が空文字
        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register(
                "Value", 
                typeof(string), 
                typeof(GreetControl), 
                new UIPropertyMetadata(""));
        #endregion

        static GreetControl()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(GreetControl), new FrameworkPropertyMetadata(typeof(GreetControl)));
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;usingとかが長いけど、追加したのはregion～endregionまでの間になる。これで、Window1.xamlでValueプロパティに値を設定できるようになる。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ccb86351-c65d-4a12-96ab-709f7034a27c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Window x:Class="WpfMyControl.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfMyControl"
    Title="Window1" Height="300" Width="300"&amp;gt;
    &amp;lt;StackPanel&amp;gt;
        &amp;lt;local:GreetControl Value="こんにちは" /&amp;gt;
    &amp;lt;/StackPanel&amp;gt;
&amp;lt;/Window&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;ビルドは通るけど、ぜんぜん動きとしては変わらない。プロパティの値を見た目に反映させるには、Generic.xamlをいじくることになる。&lt;/p&gt;
&lt;h2&gt;プロパティの値をバインドして画面に出すよ&lt;/h2&gt;
&lt;p&gt;ということでGeneric.xamlに戻って編集を再開。ValueプロパティをTextBoxにバインドして出してみようと思う。&lt;br&gt;ということでTemplateBindingでさくっとバインドをする。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:51cba7a7-115e-46de-9ee5-ada699468b5b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfMyControl"&amp;gt;


    &amp;lt;Style TargetType="{x:Type local:GreetControl}"&amp;gt;
        &amp;lt;Setter Property="Template"&amp;gt;
            &amp;lt;Setter.Value&amp;gt;
                &amp;lt;ControlTemplate TargetType="{x:Type local:GreetControl}"&amp;gt;
                    &amp;lt;Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"&amp;gt;
                        &amp;lt;StackPanel&amp;gt;
                            &amp;lt;!-- Binding!! --&amp;gt;
                            &amp;lt;TextBox Text="{TemplateBinding Value}"/&amp;gt;
                            &amp;lt;Button Content="Greet!!" /&amp;gt;
                        &amp;lt;/StackPanel&amp;gt;
                    &amp;lt;/Border&amp;gt;
                &amp;lt;/ControlTemplate&amp;gt;
            &amp;lt;/Setter.Value&amp;gt;
        &amp;lt;/Setter&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/ResourceDictionary&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;これで実行すると、画面にWindow1.xamlで設定した「こんにちは」が表示されるようになる。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFC_14ED1/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="88" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFC_14ED1/image_thumb_4.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;動きをつけよう&lt;/h2&gt;
&lt;p&gt;最後に動きをつけて完成かな。このコントロールの動きは、ボタンを押したときにポローンとメッセージボックスが出るってだけ。単純にイベントを登録するのではなく、Commandを使ってボタンのクリックを補足します。&lt;br&gt;とりあえずCommandの定義をGreetControl.csに追加。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d0c47428-e31b-4543-8162-43fb9f267917" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfMyControl
{
    public class GreetControl : Control
    {

        #region Value 依存プロパティ
        public string Value
        {
            get { return (string)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }

        // GreetControlのstring型のValueプロパティで、デフォルト値が空文字
        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register(
                "Value", 
                typeof(string), 
                typeof(GreetControl), 
                new UIPropertyMetadata(""));
        #endregion

        #region GreetCommand
        public static ICommand GreetCommand = new RoutedCommand(
            "GreetCommand", typeof(GreetControl));
        #endregion
        static GreetControl()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(GreetControl), new FrameworkPropertyMetadata(typeof(GreetControl)));
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Commandが定義できたらStaticコンストラクタにCommandBindingを追加する。Staticメソッド経由でインスタンスメソッドを呼び出してる。そこでMessageBoxの表示処理を書くって寸法。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:6c760918-3696-42b3-8e4b-2be1bb67ee37" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfMyControl
{
    public class GreetControl : Control
    {

        #region Value 依存プロパティ
        public string Value
        {
            get { return (string)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }

        // GreetControlのstring型のValueプロパティで、デフォルト値が空文字
        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register(
                "Value", 
                typeof(string), 
                typeof(GreetControl), 
                new UIPropertyMetadata(""));
        #endregion

        #region GreetCommand
        public static ICommand GreetCommand = new RoutedCommand(
            "GreetCommand", typeof(GreetControl));
        #endregion
        static GreetControl()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(GreetControl), new FrameworkPropertyMetadata(typeof(GreetControl)));
            
            // CommandBingingを登録
            var greetCommandBinding = new CommandBinding(
                GreetCommand, OnGreetCommand);
            CommandManager.RegisterClassCommandBinding(
                typeof(GreetControl), greetCommandBinding);
        }

        #region Command
        private static void OnGreetCommand(object sender, ExecutedRoutedEventArgs e)
        {
            // senderからコントロールを取得して、インスタンスメソッドに処理を丸投げ
            var control = (GreetControl)sender;
            control.OnGreetCommand();
        }

        /// &amp;lt;summary&amp;gt;
        /// GreetCommandの処理の実体
        /// &amp;lt;/summary&amp;gt;
        public void OnGreetCommand()
        {
            MessageBox.Show(this.Value);
        }
        #endregion
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;そして、Generic.xamlで、ButtonとCommandを関連付ける。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:1e3511d1-b6f8-45d3-8504-bcb497635fbd" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfMyControl"&amp;gt;


    &amp;lt;Style TargetType="{x:Type local:GreetControl}"&amp;gt;
        &amp;lt;Setter Property="Template"&amp;gt;
            &amp;lt;Setter.Value&amp;gt;
                &amp;lt;ControlTemplate TargetType="{x:Type local:GreetControl}"&amp;gt;
                    &amp;lt;Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"&amp;gt;
                        &amp;lt;StackPanel&amp;gt;
                            &amp;lt;!-- Binding!! --&amp;gt;
                            &amp;lt;TextBox Text="{TemplateBinding Value}"/&amp;gt;
                            &amp;lt;!-- Command!! --&amp;gt;
                            &amp;lt;Button Content="Greet!!" Command="{x:Static local:GreetControl.GreetCommand}" /&amp;gt;
                        &amp;lt;/StackPanel&amp;gt;
                    &amp;lt;/Border&amp;gt;
                &amp;lt;/ControlTemplate&amp;gt;
            &amp;lt;/Setter.Value&amp;gt;
        &amp;lt;/Setter&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/ResourceDictionary&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;h2&gt;動作確認&lt;/h2&gt;
&lt;p&gt;ということで、実行して動作を確認してみる。実行してボタンをぽちっとすると…&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFC_14ED1/image_5.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="243" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFC_14ED1/image_thumb_5.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;でた～！ということで始めての、作り方は正統派のコントロールの作り方でした。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/154325.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[WPF][C#]ついに妥当性検証します！ その２</title><link>http://blogs.wankuma.com/kazuki/archive/2008/08/21/153899.aspx</link><pubDate>Thu, 21 Aug 2008 22:19:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/08/21/153899.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/153899.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/08/21/153899.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/153899.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/153899.aspx</trackback:ping><description>&lt;p&gt;Validationの事に触れたのが半年前。ということで前回のエントリはこちら。&lt;br&gt;&lt;a title="http://blogs.wankuma.com/kazuki/archive/2008/02/11/122718.aspx" href="http://blogs.wankuma.com/kazuki/archive/2008/02/11/122718.aspx"&gt;http://blogs.wankuma.com/kazuki/archive/2008/02/11/122718.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;今回は、Validationクラスの細かいところをちょっと見てみようと思う。とりあえず復習がてら簡単なValidatorをこさえてみようと思う。前に作ったのと同じ偶数のみOKなバリデータ。さくっと実装。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:45eb0d38-fd87-4884-988f-527f4f2dda68" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;using System.Windows.Controls;

namespace WpfValidation
{
    /// &amp;lt;summary&amp;gt;
    /// 偶数のみ通すバリデータ
    /// &amp;lt;/summary&amp;gt;
    public class MyValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            string inputValue = value as string;
            // 入力は文字列だよね常識的に考えて
            if (value == null)
            {
                return new ValidationResult(false, "おかしい");
            }
            // 数値だよね
            int inputNumber = 0;
            if (!int.TryParse((string)value, out inputNumber))
            {
                return new ValidationResult(false, "数値ではありません");
            }
            // 偶数だよね
            if (inputNumber % 2 != 0)
            {
                return new ValidationResult(false, "偶数ではありません");
            }
            // OK!偶数だ
            return ValidationResult.ValidResult;
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Window1.xaml.csは、下のような感じ。DataContextの設定と、ボタンが押されたときに、値を表示するだけ。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:15b7c3ca-e45e-4dc1-8cfc-8424bbc5f76c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;using System.Windows;

namespace WpfValidation
{
    public partial class Window1 : Window
    {
        // これにテキストボックスの値をバインドする
        public int TargetValue { get; set; }

        public Window1()
        {
            InitializeComponent();
            // お試し用なので、自分自身をDataContextにセット
            this.DataContext = this;
        }

        private void AlertButton_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(this.TargetValue.ToString());
        }
    }
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;XAML側も、前回とほとんど同じなのでさくさくっといくよ。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e374d373-5e6e-4a19-b927-a6b78289b9ba" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Window x:Class="WpfValidation.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfValidation="clr-namespace:WpfValidation"
    Title="Validation" Height="99" Width="248"&amp;gt;
    &amp;lt;StackPanel&amp;gt;
        &amp;lt;TextBox Margin="3"&amp;gt;
            &amp;lt;TextBox.Text&amp;gt;
                &amp;lt;!-- UpdateSourceTriggerをPropertyChangedにしてテキストボックスが
                     変更されたら即ソースを書き換えるようにする。 --&amp;gt;
                &amp;lt;Binding Path="TargetValue" UpdateSourceTrigger="PropertyChanged"&amp;gt;
                    &amp;lt;Binding.ValidationRules&amp;gt;
                        &amp;lt;!-- 自作のバリデーションルール --&amp;gt;
                        &amp;lt;WpfValidation:MyValidationRule /&amp;gt;
                        &amp;lt;!-- 何か例外でたらエラーにしてくれるルール --&amp;gt;
                        &amp;lt;ExceptionValidationRule /&amp;gt;
                    &amp;lt;/Binding.ValidationRules&amp;gt;
                &amp;lt;/Binding&amp;gt;
            &amp;lt;/TextBox.Text&amp;gt;
        &amp;lt;/TextBox&amp;gt;
        &amp;lt;Button Margin="3" Content="Alert" Click="AlertButton_Click" /&amp;gt;
    &amp;lt;/StackPanel&amp;gt;
&amp;lt;/Window&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;これで、OK。実行してみよう。偶数以外では、赤枠になってる。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="100" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_thumb.png" width="244" border="0"&gt;&lt;/a&gt; &lt;a href="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_3.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="100" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_thumb_3.png" width="244" border="0"&gt;&lt;/a&gt; &lt;a href="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="100" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_thumb_4.png" width="244" border="0"&gt;&lt;/a&gt; &lt;a href="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_5.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="100" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_thumb_5.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;h1&gt;Validationプロパティの中身をのぞいてみよう&lt;/h1&gt;
&lt;p&gt;ということで！バリデーションエラーが起きたときどうなってるのかをちょっと観察してみようと思う。Validation.ErrorsとValidation.HasErrorという添付プロパティがあったりする。その値をAlertを押したときに表示してみようと思う。&lt;/p&gt;
&lt;p&gt;まずは、TextBoxにName属性をつけてC#側から触れるようにする。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:43193c46-af21-42e0-8a9e-a61eb17bee9c" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;TextBox Name="textBox" Margin="3"&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;次に、AlertのクリックイベントでValidation.ErrorsとValidation.HasErrorを表示するように書き換え。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0b6ad68c-15ec-4b24-b48e-414a26db8c80" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;private void AlertButton_Click(object sender, RoutedEventArgs e)
{
    var hasError = Validation.GetHasError(textBox);
    var errors = Validation.GetErrors(textBox);

    var sb = new StringBuilder();
    // 情報を文字列にして表示
    sb.AppendFormat("Validation.HasError: {0}\n", hasError);
    sb.Append("Validation.Errors: [");
    foreach (var error in errors)
    {
        sb.AppendFormat("{0}, ", error.ErrorContent);
    }
    sb.Append("]");
    MessageBox.Show(sb.ToString());
}
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;これを実行してみて動きを確認すると、下のような感じになる。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_6.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="200" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_thumb_6.png" width="469" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;実行直後は、エラーも何も無い。奇数を入力してみると…&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_7.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="198" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_thumb_7.png" width="547" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Validation.HasErrorがちゃんとTrueになってValidation.Errorsには、エラーの内容が入っている。エラーがあるときだけ、エラーの内容を表示しようとするとなるとStyleのTriggerを使うと出来る。&lt;br&gt;要は、TriggerでValidation.HasErrorがTrueのときにToolTipにValidation.Errorsの最初の要素のErrorContentを設定してやればいい。Styleの設定だけ抜粋。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:890d4d14-fc18-4bde-82ab-66ed0acb21f9" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;TextBox.Style&amp;gt;
    &amp;lt;Style TargetType="{x:Type TextBox}"&amp;gt;
        &amp;lt;Style.Triggers&amp;gt;
            &amp;lt;!-- エラーがあるときにメッセージをToolTipに表示 --&amp;gt;
            &amp;lt;Trigger Property="Validation.HasError" Value="True"&amp;gt;
                &amp;lt;Setter Property="ToolTip" 
                        Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}" /&amp;gt;
            &amp;lt;/Trigger&amp;gt;
        &amp;lt;/Style.Triggers&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/TextBox.Style&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;本当にやるときには、共通のStyleとしてくくりだすのがいいだろう。実行してみると、エラーメッセージがToolTipとして表示される。すばらしい。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_8.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="100" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_thumb_8.png" width="244" border="0"&gt;&lt;/a&gt; エラー無し状態&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_9.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="98" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_thumb_9.png" width="244" border="0"&gt;&lt;/a&gt; 数字じゃないとき&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_10.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="101" alt="image" src="http://kazuki.wankuma.com/images/2008/WPFC_1398D/image_thumb_10.png" width="244" border="0"&gt;&lt;/a&gt; 偶数じゃないとき&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/153899.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[WPF][C#].NET Framework 3.5 SP1で追加された機能を使ってListBoxの背景色を交互に変えるぜ</title><link>http://blogs.wankuma.com/kazuki/archive/2008/08/15/153169.aspx</link><pubDate>Fri, 15 Aug 2008 22:39:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/08/15/153169.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/153169.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/08/15/153169.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/153169.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/153169.aspx</trackback:ping><description>&lt;p&gt;AlternationCountという依存プロパティと、AlternationIndexという添付プロパティがItemsControlに追加されたっぽい。&lt;br&gt;AlternationCountを指定すると、各要素にAlternationIndexが設定されるようになる。AlternationCountが2の場合は、AlternationIndexは0,1,0,1,0,1...という感じでふられるみたいだ。&lt;/p&gt; &lt;p&gt;これと、StyleのTriggerを組み合わせることでListBoxとかの行の色を交互に変えたりってことが簡単に出来るようになるって寸法らしい。ということで早速実験。&lt;/p&gt; &lt;p&gt;いつも通りPersonクラスを定義してとかがめんどくさくなったので、ListBoxのタグの下にListBoxItemタグを直接書いてListBoxの中身をハードコーディングして適当にデータを表示する部分まででっちあげてみた。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:058528f4-56fd-48a1-a878-0a196c499591" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Window x:Class="WpfListBackground.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300"&amp;gt;
    &amp;lt;Grid&amp;gt;
        &amp;lt;ListBox&amp;gt;
            &amp;lt;ListBoxItem Content="田中　太郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　次郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　三郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　四郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　五郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　太郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　次郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　三郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　四郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　五郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　太郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　次郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　三郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　四郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　五郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　太郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　次郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　三郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　四郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　五郎" /&amp;gt;
        &amp;lt;/ListBox&amp;gt;
    &amp;lt;/Grid&amp;gt;
&amp;lt;/Window&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;実行すると、特に何の変哲も無いウィンドウとリストボックスが表示される。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/04/WPFC.NETFramework3.5SP1ListBox_13E7F/image.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://kazuki.wankuma.com/images/2008/04/WPFC.NETFramework3.5SP1ListBox_13E7F/image_thumb.png" width="243" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;今回の目玉の機能を追加していこうと思う。ListBoxに、AlternationCountプロパティの設定を追加する。交互に色を変えたいので、2を設定しておいた。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:4bf27b5d-7b85-403d-a943-eb9d4f9d255f" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;    &amp;lt;Grid&amp;gt;
        &amp;lt;ListBox AlternationCount="2"&amp;gt;
            &amp;lt;ListBoxItem Content="田中　太郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　次郎" /&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;そして、ListBoxのItemContainerStyleプロパティでAlternationIndexが0の時と1の時とでTriggerを使って背景色を変えるようなスタイルを設定する。&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e9258abf-a783-4cfc-a21b-72e36188a33e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;ListBox.ItemContainerStyle&amp;gt;
    &amp;lt;Style TargetType="{x:Type ListBoxItem}"&amp;gt;
        &amp;lt;Style.Triggers&amp;gt;
            &amp;lt;Trigger Property="ItemsControl.AlternationIndex" Value="0"&amp;gt;
                &amp;lt;Setter Property="Background" Value="LightGray" /&amp;gt;
            &amp;lt;/Trigger&amp;gt;
            &amp;lt;Trigger Property="ItemsControl.AlternationIndex" Value="1"&amp;gt;
                &amp;lt;Setter Property="Background" Value="LightGreen" /&amp;gt;
            &amp;lt;/Trigger&amp;gt;
        &amp;lt;/Style.Triggers&amp;gt;
    &amp;lt;/Style&amp;gt;
&amp;lt;/ListBox.ItemContainerStyle&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;これを実行すると、下のようになる。交互に色が変わっていていい感じ。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/04/WPFC.NETFramework3.5SP1ListBox_13E7F/image_3.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://kazuki.wankuma.com/images/2008/04/WPFC.NETFramework3.5SP1ListBox_13E7F/image_thumb_3.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;今回はC#のコードを書いてない。欲求不満だ！！&lt;br&gt;ということで、XAML全体を晒してこのエントリは終了。因みに、試してないけどItemsControlの子のコントロールは全部この方法で色を交互にしたり出来ると思われる。素敵だね。&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b40b4908-4278-4d25-9bf1-364b41f5f394" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Window x:Class="WpfListBackground.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300"&amp;gt;
    &amp;lt;Grid&amp;gt;
        &amp;lt;ListBox AlternationCount="2"&amp;gt;
            &amp;lt;ListBox.ItemContainerStyle&amp;gt;
                &amp;lt;Style TargetType="{x:Type ListBoxItem}"&amp;gt;
                    &amp;lt;Style.Triggers&amp;gt;
                        &amp;lt;Trigger Property="ItemsControl.AlternationIndex" Value="0"&amp;gt;
                            &amp;lt;Setter Property="Background" Value="LightGray" /&amp;gt;
                        &amp;lt;/Trigger&amp;gt;
                        &amp;lt;Trigger Property="ItemsControl.AlternationIndex" Value="1"&amp;gt;
                            &amp;lt;Setter Property="Background" Value="LightGreen" /&amp;gt;
                        &amp;lt;/Trigger&amp;gt;
                    &amp;lt;/Style.Triggers&amp;gt;
                &amp;lt;/Style&amp;gt;
            &amp;lt;/ListBox.ItemContainerStyle&amp;gt;
            &amp;lt;ListBoxItem Content="田中　太郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　次郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　三郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　四郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　五郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　太郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　次郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　三郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　四郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　五郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　太郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　次郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　三郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　四郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　五郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　太郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　次郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　三郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　四郎" /&amp;gt;
            &amp;lt;ListBoxItem Content="田中　五郎" /&amp;gt;
        &amp;lt;/ListBox&amp;gt;
    &amp;lt;/Grid&amp;gt;
&amp;lt;/Window&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/153169.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[WPF][C#]DataGridの表示が崩れる？</title><link>http://blogs.wankuma.com/kazuki/archive/2008/08/15/153154.aspx</link><pubDate>Fri, 15 Aug 2008 20:08:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/08/15/153154.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/153154.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/08/15/153154.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/153154.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/153154.aspx</trackback:ping><description>&lt;p&gt;DataGridをちょっと触ってて気になることがおきた。&lt;br&gt;再現の仕方がわからないけど、表示が崩れることがあるっぽい。10000行のあるデータを表示させてスクロールさせると、たまにずれてる。百聞は一見にしかずということなので、スクリーンショット。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/04/WPFCDataGrid_11B13/image.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="162" alt="image" src="http://kazuki.wankuma.com/images/2008/04/WPFCDataGrid_11B13/image_thumb.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;これは、ちょっと悲しい。何だろう？&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/153154.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[WPF][C#]WPFのDataGridにコンボボックス出してみよう</title><link>http://blogs.wankuma.com/kazuki/archive/2008/08/15/153146.aspx</link><pubDate>Fri, 15 Aug 2008 18:01:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/08/15/153146.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/153146.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/08/15/153146.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/153146.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/153146.aspx</trackback:ping><description>&lt;p&gt;１つ前のエントリでは、CheckBoxを列に出してみた。引き続きComboBoxを出してみようと思う。Personクラスをちょろっと拡張して年齢を持たせることにした。年齢の男/女をComboBoxで表示させようって寸法だ。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0abd4195-f87e-42b9-9230-0aa376964e45" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;
namespace WpfDataTableSample
{
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        // C#好きかどうかのフラグ
        public bool CSharper { get; set; }
        // 性別
        public GenderType Gender { get; set; }
    }

    public enum GenderType
    {
        男,女
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;DataContextに突っ込むデータにも、男と女が交互に出るように書き換えた。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:5d0cb5b5-2e6e-4fe7-b54f-a70c3b280bd0" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;            DataContext = Enumerable.Range(10, 50).Select(i =&amp;gt;
                new Person 
                { 
                    Name = "田中　太郎 no" + i, 
                    Age = i % 50, 
                    CSharper = i % 5 == 0,
                    Gender = i % 2 == 0 ? GenderType.男 : GenderType.女
                }).ToList();
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;次に、ComboBoxを表示するための列の定義を行う。そのための下準備としてWindowのResourcesプロパティにComboBoxに表示するための元データを定義しておく。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ccff1c3d-2acd-48fa-91ed-411963e53723" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;Window.Resources&amp;gt;
    &amp;lt;!-- 性別のコンボボックスに表示するためのデータ --&amp;gt;
    &amp;lt;x:Array x:Key="GenderTypeSource" Type="{x:Type WpfDataTableSample:GenderType}"&amp;gt;
        &amp;lt;WpfDataTableSample:GenderType&amp;gt;男&amp;lt;/WpfDataTableSample:GenderType&amp;gt;
        &amp;lt;WpfDataTableSample:GenderType&amp;gt;女&amp;lt;/WpfDataTableSample:GenderType&amp;gt;
    &amp;lt;/x:Array&amp;gt;
&amp;lt;/Window.Resources&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;そして、DataGridComboBoxColumnをDataGridのColumnsプロパティに追加する。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:46f31bac-5270-43aa-b867-1a8dc2112918" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;!-- 自動でカラムを生成しないように指定 --&amp;gt;
&amp;lt;WPFToolkit:DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False"&amp;gt;
    &amp;lt;WPFToolkit:DataGrid.Columns&amp;gt;
        &amp;lt;!-- 名前の表示 --&amp;gt;
        &amp;lt;WPFToolkit:DataGridTextColumn DataFieldBinding="{Binding Name}" 
                                       Header="なまえ" /&amp;gt;
        &amp;lt;!-- 年齢の表示 StringFormatでフォーマットも指定してみた --&amp;gt;
        &amp;lt;WPFToolkit:DataGridTextColumn DataFieldBinding="{Binding Age, StringFormat=000歳}"
                                       Header="ねんれい" /&amp;gt;
        &amp;lt;!-- CheckBoxを使うときも基本的にTextBoxと同じようにいける --&amp;gt;
        &amp;lt;WPFToolkit:DataGridCheckBoxColumn DataFieldBinding="{Binding CSharper}"
                                           Header="C#大好き？" /&amp;gt;
        &amp;lt;!-- 性別！ --&amp;gt;
        &amp;lt;WPFToolkit:DataGridComboBoxColumn DataFieldBinding="{Binding Gender}"
                                           Header="性別" 
                                           ItemsSource="{Binding Source={StaticResource GenderTypeSource}}" &amp;gt;
        &amp;lt;/WPFToolkit:DataGridComboBoxColumn&amp;gt;
    &amp;lt;/WPFToolkit:DataGrid.Columns&amp;gt;
&amp;lt;/WPFToolkit:DataGrid&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;TextBoxやCheckBoxのときと同じようにDataFieldBindingとHeaderプロパティに値を設定する。そして、ComboBoxに表意jするためのデータをItemsSourceプロパティに設定する。&lt;br&gt;今回の例では、さっきWindowのResourcesに用意したGenderTypeSourceをバインドした。&lt;/p&gt;
&lt;p&gt;この状態で実行すると、コンボボックスで男と女を選べるようになる。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/04/WPFCWPFDataGrid_DA4F/image.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="200" alt="image" src="http://kazuki.wankuma.com/images/2008/04/WPFCWPFDataGrid_DA4F/image_thumb.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;ここまで順調にきてる。いい感じだ。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/153146.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>kazuki@wankuma.com (かずき)</dc:creator><title>[C#][WPF]DataGridにbool型のデータを表示してみる（CheckBox使うってことね）</title><link>http://blogs.wankuma.com/kazuki/archive/2008/08/15/153145.aspx</link><pubDate>Fri, 15 Aug 2008 18:01:00 GMT</pubDate><guid>http://blogs.wankuma.com/kazuki/archive/2008/08/15/153145.aspx</guid><wfw:comment>http://blogs.wankuma.com/kazuki/comments/153145.aspx</wfw:comment><comments>http://blogs.wankuma.com/kazuki/archive/2008/08/15/153145.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/kazuki/comments/commentRss/153145.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/kazuki/services/trackbacks/153145.aspx</trackback:ping><description>&lt;p&gt;１つ前のエントリの続き。DataGridTextBoxColumn以外のカラムも使ってみようと思う。とりあえず、CheckBoxから使ってみたいと思う。&lt;/p&gt; &lt;p&gt;CheckBoxなので、bool型のデータを表示するのが一番素直だと思うので、PersonクラスにC#が好きかどうかをあらわすプロパティを追加してみた。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:442ebe8e-2c70-408c-a386-12e44ebd99a0" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;
namespace WpfDataTableSample
{
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        // C#好きかどうかのフラグ
        public bool CSharper { get; set; }
    }
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;DataContextに突っ込むデータもちょいと変更。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:951cd657-3154-46dc-b4fd-0d72deabd405" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="c#"&gt;// 5人に1人は、C#大好き
DataContext = Enumerable.Range(10, 50).Select(i =&amp;gt;
    new Person { Name = "田中　太郎 no" + i, Age = i % 50, CSharper = i % 5 == 0 }).ToList();
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;XAMLにもDataGridCheckBoxColumnの定義を追加した。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b34ca8c8-fce0-40ca-9eef-3fdc9ac169ac" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;!-- 自動でカラムを生成しないように指定 --&amp;gt;
&amp;lt;WPFToolkit:DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False"&amp;gt;
    &amp;lt;WPFToolkit:DataGrid.Columns&amp;gt;
        &amp;lt;!-- 名前の表示 --&amp;gt;
        &amp;lt;WPFToolkit:DataGridTextColumn DataFieldBinding="{Binding Name}" 
                                       Header="なまえ" /&amp;gt;
        &amp;lt;!-- 年齢の表示 StringFormatでフォーマットも指定してみた --&amp;gt;
        &amp;lt;WPFToolkit:DataGridTextColumn DataFieldBinding="{Binding Age, StringFormat=000歳}"
                                       Header="ねんれい" /&amp;gt;
        &amp;lt;!-- CheckBoxを使うときも基本的にTextBoxと同じようにいける --&amp;gt;
        &amp;lt;WPFToolkit:DataGridCheckBoxColumn DataFieldBinding="{Binding CSharper}"
                                           Header="C#大好き？" /&amp;gt;
    &amp;lt;/WPFToolkit:DataGrid.Columns&amp;gt;
&amp;lt;/WPFToolkit:DataGrid&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;コメントにもあるように、基本的にTextBoxを表示するときと同じ感じで使える。実行すると予想通りの結果が得られる。&lt;br&gt;チェックボックスがいい感じ。&lt;br&gt;&lt;a href="http://kazuki.wankuma.com/images/2008/04/CWPFDataGridboolCheckBox_CF6F/image.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="image" src="http://kazuki.wankuma.com/images/2008/04/CWPFDataGridboolCheckBox_CF6F/image_thumb.png" width="244" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;ここまでも順調だ。マニュアル（あるのかな？）見ないで、まだまだいけそうだ。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/kazuki/aggbug/153145.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>