1

装飾されたコントロールのいくつかのプロパティ値に応じて、エラー テンプレートの外観を変えたいと思います。

以下のように TargetType を設定すると、実行時例外が発生します: 'TextBox' ControlTemplate TargetType は、テンプレート化された型 'Control' と一致しません。したがって、ErrorTemplate は「Control」の targetType を使用する必要があるようです。

<ControlTemplate x:Key="ValidationErrorTemplate" TargetType={x:Type TextBox}>
  <Grid>
    <AdornedElementPlaceholder  HorizontalAlignment="Left" Name="placeholder"/>
    <Grid Background="Yellow">
      <Grid.Style>
        <Style TargetType="Grid">
          <Style.Triggers>
            <DataTrigger Binding="{TemplateBinding IsReadOnly}" Value="True">
              <Setter Property="Background" Value="Green"/>
            </DataTrigger>
          </Style.Triggers>
        </Style>
      </Grid.Style>
    </Grid>
  </Grid>
</ControlTemplate>

targetType を削除してから、これを試しました:

<DataTrigger Binding="{Binding IsReadOnly, RelativeSource={RelativeSource AncestorType={x:Type TextBox}}}" Value="True">
  <Setter Property="Background" Value="Green"/>
</DataTrigger>

そして、これは例外も効果もありませんでした:

<DataTrigger Binding="{Binding AdornedElement.(TextBox.IsReadOnly), ElementName=placeholder}" Value="True">
  <Setter Property="Background" Value="Orange"/>
</DataTrigger>

そして、これは例外も効果もありませんでした:

<DataTrigger Binding="{Binding (TextBox.IsReadOnly), ElementName=placeholder}" Value="True">
  <Setter Property="Background" Value="Orange"/>
</DataTrigger>

そして最後に、「BindingExpression パス エラー: 'IsReadOnly' プロパティが 'object' ''AdornedElementPlaceholder' に見つかりませんでした」:

<DataTrigger Binding="{Binding IsReadOnly, ElementName=placeholder}" Value="True">
  <Setter Property="Background" Value="Green"/>
</DataTrigger>

ErrorTemplate で依存関係プロパティを参照する方法について、他のアイデアはありますか?

4

1 に答える 1

2

正解は次のとおりです。

<DataTrigger Binding="{Binding AdornedElement.(TextBox.IsReadOnly), ElementName=placeholder}" Value="True">
  <Setter Property="Background" Value="Orange"/>
</DataTrigger>

これは私の早い段階で失敗した試みの 1 つでしたが、私のテスト設定には欠陥がありました。スタイルで設定するのではなく、グリッドでデフォルトの背景プロパティを設定していました。依存関係プロパティの優先順位により、オブジェクトに直接設定された値は、スタイル (具体的にはトリガー) に設定された値よりも常に優先されます。

これが作業セットアップです:

<ControlTemplate x:Key="ValidationErrorTemplate">
  <Grid>
    <Grid.Style>
      <Style TargetType="{x:Type Grid}">
        <Setter Property="Background" Value="Yellow"/>
        <Style.Triggers>
          <DataTrigger Binding="{Binding AdornedElement.(TextBox.IsReadOnly), ElementName=placeholder}" Value="True">
            <Setter Property="Background" Value="Orange"/>
          </DataTrigger>
        </Style.Triggers>
      </Style>
    </Grid.Style>

    <AdornedElementPlaceholder Name="placeholder"/>
  </Grid>
</ControlTemplate>

ここでの重要な点の 1 つは、AdornedElement は常に Control 型であるため、Control で公開されていないプロパティにアクセスするには、適切な修飾 (またはキャスト) を行う必要があることです。これは、クラス名とプロパティを括弧で囲んで行います。別の例: AdornedElement.(CheckBox.IsChecked)。IsChecked は Control にはないため、プロパティを所有するクラス タイプを明示的に指定して修飾する必要があります。

于 2014-10-07T12:05:41.807 に答える