1

周りを見回しましたが、具体的に問題を見つけることができません。IDataErrorInfoまたはValidataionルールに基づくエラーが特定のコントロールに失敗した場合に備えて、WPF内のデフォルトの「エラー」処理によってコントロールの周囲に「Adorner」が配置されることを知っています。これはすべて問題ありませんが、タブ付きのページインターフェイスでは、コントロールに無効のフラグが付けられている場合、それらは赤い枠線で適切に装飾されます。ただし、タブページ1から2に移動して1に戻るとすぐに、すべての装飾者が消えます(悪い)。これはすでに求められており、解決策は受け入れられましたが、より良い代替案を探していました。

そこで、「テーマ」宣言に進み、テキストボックスコントロールについては、境界線だけでなく、コントロールの背景色全体を赤に設定するように指示しました。プロパティが変更されたときに通知を介して強制的にトリガーする必要がない場合、ページを入れ替えても、テキストボックス全体の赤い背景は一定のままです。

次に、コンボボックスコントロールに移ります。独自にカスタマイズしたり、コントロールのデフォルトのMSバージョンを調べたりした場合は、コンボボックスの魔法を機能させるために、実際にはコントロール、グリッド、列、ボタンなどのクラスター化された混乱が発生します。簡単に...

ControlTemplateグリッド(2つの列、1つは選択したテキスト表示用、2番目の列はドロップダウン矢印用)両方の列にまたがる境界線パス(線画/コンボボックスのドロップダウン画像用のグリフ)

ControlTemplate TargetTypeテキストボックス(コンボボックスセット全体の一部として)境界線、具体的には「PART_ContentHost」

コンボボックスグリッドトグルボタンドロップダウンのControlTemplateが表示され、他のトリガーのリストが表示されます。

最後に、上記のコンポーネントによってテンプレート化されたメインのComboBox宣言。

とにかく、私は私の人生のためにこれを得ることができません。コンボボックス宣言の[トグルボタン]領域に、トリガーが機能し、ControlTemplate宣言内の正しい場所にあることを証明するために、背景をOBVIOUSオフカラーに変更するトリガーがあります。

したがって、これがコンボボックス宣言内の正しい場所であることを知っているので、データにエラーがある場合は、緑の背景色を赤に置き換えたいと思います。ネイティブエラーハンドラが示すように、全体的な「Validation.HasError」が適切にトリガーされていることを知っています。テンプレート内のどこでどのように背景色を赤に変更しようとしても、機能しません。コンバーターを使用して、複数のプロパティを試し、DataTriggersを実行しようとしましたが、連携していないようです。

助言がありますか?これは本当に迷惑になっています。

4

1 に答える 1

2

最後に、それを手に入れました...そして私が推測したほど明白ではありません。とにかく、これが私が見つけたものです。コンボボックスのMicrosoftのテンプレートからのサンプルを使用した場合、最初に2列の「ToggleButton」宣言全体が提供されます。

<ControlTemplate TargetType="ToggleButton" 
   x:Key="baseComboBoxToggleButton" >

  ... blah blah...

</ControlTemplate>

次に、コンボボックスの「表示値」の宣言

<ControlTemplate TargetType="TextBox" x:Key="ComboBoxTextBox" >
   <Border x:Name="PART_ContentHost" Focusable="False" 
           Background="{TemplateBinding Background}" />
</ControlTemplate>

次に、それらを1つのコンボボックス「ラッパー」宣言として結び付けます

<ControlTemplate TargetType="ComboBox" x:Key="ComboBoxGridControlTemplate" >
   <Grid x:Name="GridComboWrapper">
      <!-- This is the dropdown button that POINTS TO THE "baseComboBoxToggleButton at the top -->
      <ToggleButton Name="ToggleButton" 
        Template="{StaticResource baseComboBoxToggleButton}" 
        Grid.Column="2" Focusable="false"
        IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay,
                RelativeSource={RelativeSource TemplatedParent}}"
                ClickMode="Press" >
      </ToggleButton>

      ...
      rest of the content presenter,
      EDIT(able) textbox area,
      popup area of combobox when in drop-down mode

   </Grid> 


   <ControlTemplate.Triggers>

      <!-- PUT THE VALIDATION CHECK HERE -->
      <Trigger Property="Validation.HasError" Value="true">
         <Setter Property="ToolTip" 
                 Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                 Path=(Validation.Errors)[0].ErrorContent}"/>


         <!-- THIS IS THE CRITICAL COMPONENT... I HAD TO EXPLICITLY TELL
              The TagetName as the "ToggleButton" and change ITs Background property
              and it now works -->
         <Setter TargetName="ToggleButton" Property="Background" 
                 Value="{StaticResource BrushDataInvalidBorder}" />
      </Trigger>

   </ControlTemplate.Triggers>
</ControlTemplate>

これで、意図したとおりに機能し、特定のフォームのアクティブなページが変更されてクリアされたからといって、装飾が失われることはありません...期待どおりに個々のコントロールに対して静的です...うわー...これはなんとPITAですだった。

このネストされたレベルのものを学びながら、将来誰かが壁に過度の頭をぶつけないようにするのに役立つことを願っています。

于 2012-05-29T20:11:40.087 に答える