かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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が設定できます。
エラーメッセージがオブジェクトに関するものか、特定のプロパティに関するものかを設定できるみたいですが、見た目上の変化はわかりませんでした。
何かにこっそり使われているのだろうか。