かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

ValidationSummaryコントロール その2

前回

前回は、単純にValidationSummaryコントロールにValidationSummaryItemを追加しました。
今回は、もうちょっとValidationSummaryItemについて見てみようと思います。

下準備

下のような画面を作ります。

<UserControl xmlns:dataInput="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input"  x:Class="SilverlightApplication4.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
    <StackPanel x:Name="LayoutRoot">
        <TextBox x:Name="textBox1" />
        <Button Content="Add" Click="AddButton_Click" />
        <dataInput:ValidationSummary x:Name="summary" />
    </StackPanel>
</UserControl>

コードビハインドは、AddButton_Clickイベントハンドラを追加している以外は、初期状態です。

ヘッダーの表示

前回はメッセージだけ表示していましたが、これにヘッダーをつけることができます。
ヘッダーといっても、メッセージの左側に、太字で文字が追加されるだけです。

このヘッダーをつけるためには、ValidationSummaryItemのMessageHeaderプロパティを設定します。
コードだと以下のようになります。

using System.Windows;
using System.Windows.Controls;

namespace SilverlightApplication4
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void AddButton_Click(object sender, RoutedEventArgs e)
        {
            // テキストボックスに入力されたものをValidationSummaryに表示する
            var item = new ValidationSummaryItem(textBox1.Text);
            // そのメッセージのヘッダーにへっだーという文字列を表示させる
            item.MessageHeader = "へっだー";

            // メッセージを追加
            summary.Errors.Add(item);
        }
    }
}

このプログラムを実行してボタンを押すと、以下のような結果になります。

ちゃんとヘッダーが表示されているのがわかります。

ValidationSummaryのメッセージをクリックしたときにコントロールへフォーカスをうつす

長いタイトルですが、タイトルの通りです。
これには、ValidationSummaryItemSourceクラスをValidationSummaryItemに追加することで実現できます。

private void AddButton_Click(object sender, RoutedEventArgs e)
{
    // テキストボックスに入力されたものをValidationSummaryに表示する
    var item = new ValidationSummaryItem(textBox1.Text);
    // そのメッセージのヘッダーにへっだーという文字列を表示させる
    item.MessageHeader = "へっだー";

    // 第一引数にプロパティ名と、第二引数にテキストボックスがエラーの
    // 原因だよみたいなことを指定してる。
    item.Sources.Add(new ValidationSummaryItemSource(
        "Hoge", textBox1));

    // メッセージを追加
    summary.Errors.Add(item);
}

実行結果の見た目は変わらないので省略しますが、ValidationSummaryに表示されたメッセージをクリックすると、テキストボックスにフォーカスが移動します。

因みに、ValidationSummaryItemSourceを複数追加すると、メッセージをクリックするたびにフォーカスが順番に移動していきます。

item.Sources.Add(new ValidationSummaryItemSource(
    "Hoge", textBox1));
item.Sources.Add(new ValidationSummaryItemSource(
    "Fuga", textBox2));

↑だと、最初にメッセージをクリックするとtextBox1へ、二回目のクリックでtextBox2へフォーカスが移動します。

ItemType

これ、設定しても何が変わるのかわかりません・・・。
ValidationSummaryItemType列挙体のObjectErrorとPropertyErrorが設定できます。
エラーメッセージがオブジェクトに関するものか、特定のプロパティに関するものかを設定できるみたいですが、見た目上の変化はわかりませんでした。
何かにこっそり使われているのだろうか。