バージョン

データ エラーのスタイリング

始める前に

DataPresenter コントロールは、データ エラーをスタイルするために 2 種類の方法を提供します。エラー アイコンの外観を変更したいだけの場合、エラー アイコンのテンプレートを変更するスタイルを作成できます。ただし、セル内のエラー アイコンの配置を制御したい場合やセルの高さを変更したい場合、データエラーの表示を定義するためにデータ テンプレートを作成できます。

達成すること

エラー アイコンのスタイルとセルの値の右側にエラー アイコンを配置するデータ テンプレートを作成します。スタイルおよびデータ テンプレートを作成する時に DataPresenterBase クラスによって公開された定義済みのリソースキーも使用します。そうすれば、DataPresenter コントロールは自動的にすべてのデータ エラーにそれらを適用します。

スタイルおよびデータ テンプレートを含むリソース ディクショナリの範囲は、どの DataPresenter コントロールが影響を受けるのかを決定します。たとえば、ウィンドウのリソース ディクショナリにスタイルとデータ テンプレートを追加すると、ウィンドウのすべての DataPresenter コントロールに影響します。スタイルとデータ テンプレートをコントロールのローカル リソース ディクショナリに追加することによって、DataPresenter コントロールを選択的にスタイルするために、この動作を使用することができます。さらに、スタイルとデータテンプレートをひとつのフィールドのみに影響させたい場合には、 CellValuePresenter クラスを対象とするキースタイルを作成して、それらをリソース ディクショナリに追加できます。Field オブジェクトの FieldSettings プロパティによって公開されている CellValuePresenterStyle プロパティを設定すると、スタイルとデータ テンプレートはそのフィールドのデータ エラーだけに影響を及ぼします。

次の手順を実行します

  1. エラー アイコンのスタイルを作成し、それをウィンドウのリソース ディクショナリに追加します。

    1. TargetType プロパティを "{x:Type Control}" に設定します。

    2. Key プロパティを "{x:Static igDP:DataPresenterBase.DataErrorIconStyleKey}" に設定します。DataPresenterBase クラスによって公開されたリソース キーを使用しているので、DataPresenter コントロールは自動的にこのスタイルをエラー アイコンに適用します。

    3. Template プロパティの Setter 要素を追加します。

    4. Ellipse オブジェクトをコントロールのテンプレートに追加します。

XAML の場合:

<Style TargetType="{x:Type Control}" x:Key="{x:Static igDP:DataPresenterBase.DataErrorIconStyleKey}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Control}">
                <Ellipse Fill="Red" Width="10" Height="10" />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
  1. データ エラーのデータ テンプレートを作成し、それをウィンドウのリソース ディクショナリに追加します。

    1. Key プロパティを "{x:Static igDP:DataPresenterBase.DataErrorContentTemplateKey}" に設定します。

    2. データ テンプレートの Triggers コレクション用のタグを追加します。

XAML の場合:

<DataTemplate x:Key="{x:Static igDP:DataPresenterBase.DataErrorContentTemplateKey}">
    <!--TODO: ここにビジュアル ツリーを追加します -->
    <DataTemplate.Triggers>
        <!--TODO: エラー アイコンを表示するには MultiDataTrigger を追加します -->
        <!--: ハイライトを表示するのに MultiDataTrigger を追加します -->
    </DataTemplate.Triggers>
</DataTemplate>
  1. Grid パネルをデータ テンプレートに追加します。Grid パネルはデータ エラーのルート レイアウト パネルになります。

    1. ColumnDefinition オブジェクトを追加し、その Width プロパティを * に設定します。

    2. ColumnDefinition オブジェクトを追加し、その Width プロパティを Auto に設定します。

XAML の場合:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <!--: セルの値を表示するのにコンテンツ プレゼンターを追加します -->
    <!--: エラー アイコンのためのコントロールを追加します -->
    <!--: ハイライトのための境界線を追加します -->
</Grid>
  1. ContentPresenter オブジェクトを Grid パネルの最初の列に追加し、その ContentTemplate プロパティを NULL に設定します。コンテンツ プレゼンターは、セルの値を表示します。

XAML の場合:

<ContentPresenter ContentTemplate="{x:Null}" />
  1. Control オブジェクトを Grid パネルの 2 番目の列に追加します。

    1. errorIcon と名前を付けます。

    2. Visibility プロパティを Collapsed に設定します。

    3. DataPresenterBase クラスによって公開された DataErrorIconStyleKey プロパティを使用して、その Style プロパティを動的なリソースに設定します。

    4. その ToolTip プロパティを CellValuePresenter オブジェクトの DataError プロパティに設定します。

XAML の場合:

<Control
    Grid.Column="1"
    Name="errorIcon"
    Visibility="Collapsed"
    Style="{DynamicResource {x:Static igDP:DataPresenterBase.DataErrorIconStyleKey}}"
    ToolTip="{Binding Host.DataError}" />
  1. Border オブジェクトを Grid パネルの最初の列に追加します。この時点でプロジェクトをビルドおよび実行する場合、エラー アイコンおよびエラーの強調表示は、データ項目がエラーを含む場合であっても表示されません。データ エラーが発生する場合、それらを表示するためにデータ テンプレートにトリガーを追加する必要があります。

    1. errorHighlight と名前を付けます。

    2. BorderBrush プロパティを赤に設定します。

    3. BorderThickness プロパティを 1 に設定します。

    4. Visibility プロパティを Collapsed に設定します。

XAML の場合:

<Border Name="errorHighlight" BorderBrush="Red" BorderThickness="1" Visibility="Collapsed" />
  1. データ テンプレートの Triggers コレクションに MultiDataTrigger 要素を追加します。セルにデータ エラーがありエラー アイコンが表示される場合、"errorIcon" と名前を付けられたコントロールの Visibility プロパティを True に設定します。

    1. CellValuePresenter オブジェクトの HasDataError プロパティの Condition 要素を Conditions コレクションに追加します。

    2. CellValuePresenter オブジェクトの IsDataErrorDisplayModeIcon プロパティの Condition 要素を Conditions コレクションに追加します。

    3. エラー アイコンの Visibility プロパティを Visible に設定する Setter 要素を追加します。

XAML の場合:

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding Host.HasDataError}" Value="True" />
        <Condition Binding="{Binding Host.IsDataErrorDisplayModeIcon}" Value="True" />
    </MultiDataTrigger.Conditions>
    <Setter TargetName="errorIcon" Property="Visibility" Value="Visible" />
</MultiDataTrigger>
  1. データ テンプレートの Triggers コレクションに MultiDataTrigger 要素を追加します。セルにデータ エラーがありエラーが強調表示される場合、"errorHighlight" と名前を付けられた Border オブジェクトの Visibility プロパティを True に設定します。

    1. CellValuePresenter オブジェクトの HasDataError プロパティの Condition 要素を Conditions コレクションに追加します。

    2. CellValuePresenter オブジェクトの IsDataErrorDisplayModeHighlight プロパティの Condition 要素を Conditions コレクションに追加します。

    3. Border オブジェクトの Visibility プロパティを Visible に設定する Setter 要素を追加します。

XAML の場合:

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding Host.HasDataError}" Value="True" />
        <Condition Binding="{Binding Host.IsDataErrorDisplayModeHighlight}" Value="True" />
    </MultiDataTrigger.Conditions>
    <Setter TargetName="errorHighlight" Property="Visibility" Value="Visible" />
</MultiDataTrigger>
  1. プロジェクトを実行します。データ項目にエラーが含まれる場合、以下のスクリーンショットのように DataPresenter コントロールはデータ エラーを表示します。

xamDataPresenter Styling Data Errors 01.png