2011-10-19 1 views
3

XAML階層のスタイルを理解しようとしています...シンプルで単純なTextbox ... " 「IsEnabled」フラグに基づいて背景色を無効にします。大丈夫です。テーマ/スタイルを引き継ぎ、追加のトリガーを適用しようとしています

今、私はTextBox ... MyTextBoxから派生した別のクラスを持っています。このクラスでは、プロパティ(依存プロパティではないため、DataTriggerを使用していました)があります。だから、私は正常に機能していたすべてのTextBoxアクションを保持したいが、現在、背景色を他の色に適切に更新するための新しいトリガーを取得する。ただ明確にするために、色のための私の静的リソースはすべて固体のブラシです。

<Style TargetType="TextBox" > 
    <Setter Property="FontFamily" Value="Courier New" /> 
    <Setter Property="FontSize" Value="12" /> 
    <Setter Property="Foreground" Value="{StaticResource MyForeground}" /> 
    <Setter Property="Background" Value="{StaticResource MyBackground}" /> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="TextBox"> 
     <Border Name="Bd" BorderThickness="{TemplateBinding BorderThickness}" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      Background="{TemplateBinding Background}" 
      SnapsToDevicePixels="true"> 

      <ScrollViewer Name="PART_ContentHost" 
       Background="{TemplateBinding Background}" 
       SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
     </Border> 

     <ControlTemplate.Triggers> 
      <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="Background" Value="{StaticResource MyDisBackground}" /> 
      <Setter TargetName="PART_ContentHost" Property="Background" 
       Value="MyDisBackground"/> 
      </Trigger> 
     </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

<!-- Now, my derived (or so I was hoping) style that just adds additional trigger --> 
<Style TargetType="local:MyTextBox" BasedOn="{StaticResource {x:Type TextBox}}" > 
    <Style.Triggers> 
    <DataTrigger Binding="{Binding Path=IsRequired}" Value="True"> 
     <Setter Property="Background" Value="{StaticResource RequiredBackground}" /> 
    </DataTrigger> 
    </Style.Triggers> 
</Style> 

私は何か簡単なものがありますか?

答えて

1

まず、DataTriggerMyTextBox(コントロール自体ではない)のDataContextを探しています。だからあなたのような何かをする必要があると思い、コントロールを見て:

<DataTrigger Binding="{Binding Path=IsRequired, RelativeSource={RelativeSource Self}}" Value="True"> 
    <Setter Property="Background" Value="{StaticResource RequiredBackground}" /> 
</DataTrigger> 

MyTextBox.IsRequiredがtrueの場合今ではMyTextBox.Backgroundプロパティを設定します。しかし、依存関係プロパティの値はprecedence orderです。あなたのRequiredBackgroundブラシが使用されることはありません、以下の場合には

<local:MyTextBox /> 

:だから、上記の視覚のように使用する背景を変更します。この場合

<local:MyTextBox IsEnabled="False" /> 

ScrollViewer.BackgroundMyDisBackgroundに変更し、もはやMyTextBox.Backgroundプロパティにバインドされています。その代わりに、MyDisBackgroundブラシが表示されます。 はまだRequiredBackgroundになりますが、現在は使用されていません。

最後に、次の場合、RequiredBackgroundブラシは使用されません。ここ

<local:MyTextBox Background="Yellow" /> 

スタイル設定部は第8位である間、局所値(黄色)は、優先順位リストで3位です。

あなたはあなたの財産のようなデフォルトはfalseが、その後、あなたが何かを行うことができ、依存関係プロパティにする場合は、次のプロパティがテキストボックスには存在しません本家、それはまだあなたの既定値を取得することができます

<Style TargetType="TextBox" > 
    <Setter Property="FontFamily" Value="Courier New" /> 
    <Setter Property="FontSize" Value="12" /> 
    <Setter Property="Foreground" Value="{StaticResource MyForeground}" /> 
    <Setter Property="Background" Value="{StaticResource MyBackground}" /> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="TextBox"> 
     <Border Name="Bd" BorderThickness="{TemplateBinding BorderThickness}" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      Background="{TemplateBinding Background}" 
      SnapsToDevicePixels="true"> 

      <ScrollViewer Name="PART_ContentHost" 
       Background="{TemplateBinding Background}" 
       SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
     </Border> 

     <ControlTemplate.Triggers> 
      <Trigger Property="local:MyTextBox.IsRequired" Value="False"> 
      <Setter Property="Background" Value="{StaticResource RequiredBackground}" /> 
      <Setter TargetName="PART_ContentHost" Property="Background" 
       Value="RequiredBackground"/> 
      </Trigger> 
      <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="Background" Value="{StaticResource MyDisBackground}" /> 
      <Setter TargetName="PART_ContentHost" Property="Background" 
       Value="MyDisBackground"/> 
      </Trigger> 
     </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

<Style TargetType="local:MyTextBox" BasedOn="{StaticResource {x:Type TextBox}}" /> 

それをトリガーします。しかし、それはTextBoxのために設定されるので、そのトリガーは決して使用されません。

+0

コードをコピーして、CodeNakedが最初に示した変更を行いました。** Binding = "{Binding Path = IsRequired、RelativeSource = {RelativeSource Self}}" **この変更だけで動作するように見えました(あなたの ' MyTextBoxクラスは、あなたのIsRequiredプロパティでINotifyPropertyChangedを実装しています。私が行ったことを正確に示すためにコードを投稿します。しかし、私は実際にそれを思いついた人ではなかったので、競合する回答を投稿したくありません。 。 – Scott

+0

@Scott両方の入力のおかげで、彼らは私が望んでいたように動作しているように見え、両方の条件の下でどのようにDependencyPropertyとして、もう1つはINotifyPropertyChanged経由で(どちらが私が既に行っていたか)を確認してください。 – DRapp

+0

@DRapp、あなたのソリューションが動作しているのを見てください!あなたが持っている2つのソリューションのうち... XAMLで値を直接設定できるように、依存プロパティのソリューションが必要です。私はちょうどあなたがあなたがDependencyPropertyを使用していないということをあなたの質問で特に言い、あなたがそれを避けることを望んだと思われたことに気づいた。 – Scott

関連する問題