2011-08-19 11 views
10

この動作は私にとって非常に奇妙に思えます。私はContentControl DataContractを使用してTabControlをレンダリングしています。タブが開いていないときに画像を表示したいときは非表示にしたい。しかし、ここに問題があります:WPFトリガーは、要素に設定されている場合、プロパティを設定しません。

<Image Name="image1" Stretch="Uniform" Visibility="Hidden" Source="/Affinity;component/Images/affinity_logo.png"> 
      <Image.Style> 
       <Style TargetType="Image"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Items.Count, ElementName=tabcontrolworkspaces}" 
         Value="0"> 
          <Setter Property="Visibility" Value="Visible" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Image.Style> 
     </Image> 

これは動作しません...並べ替え。

私はこれをVisiblityとMarginでテストしました(確かに)。このプロパティがImageタグで定義されていない限り、このトリガーはプロパティを変更します。そうである場合、トリガはそのプロパティを更新しません。したがって、画像の可視性を定義せず、トリガーがそれを隠すと、それは機能します。問題は、デフォルトはVisibleで、トリガーはvalue = 0のときにトリガーを表示し、それ以外の場合は非表示にする必要があることです。

なぜトリガーは明示的に定義されたプロパティを上書きしませんか?その目的ではないのですか?

+0

他の方法で設定しましたか?のように、!= "0"の場合、可視性は表示されません。 – mydogisbox

+0

トリガー値に!=を使用することはできますか? – Tyrsius

+0

直接的なものではありませんが、少しの労力でそれを行うことができます。 @ CodeNakedはより良い解決策を持っています。ここには、望ましくない解決策があります。 http://blogs.msdn.com/b/mikehillberg/archive/2008/09/30/comparabledatatrigger.aspx – mydogisbox

答えて

18

これは通常のDependency Property Value Precedenceです。 Imageに設定するのは#3ですが、Styleトリガーでは#6の優先順位が低くなります。

あなたは代わりにこれを行うことができます。

<Image Name="image1" Stretch="Uniform" Source="/Affinity;component/Images/affinity_logo.png"> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Setter Property="Visibility" Value="Hidden" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Items.Count, ElementName=tabcontrolworkspaces}" 
        Value="0"> 
        <Setter Property="Visibility" Value="Visible" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Image.Style> 
</Image> 
+0

+1私は時々、時々Setterをスタイルに設定する必要があるのと、トリガー用のトリガー作業する – Rachel

+0

これは、デフォルト値またはメタデータから継承された値には適用されません。トリガーを設定するだけでなく、セッターの値を設定する必要がある理由については、私の答えを参照してください。 – mydogisbox

+0

@mydogisbox - あなたは何を意味するのか分かりません。トリガーがVisibilityをHiddenに設定し、トリガーの外側に追加のSetterがない場合、トリガーが適用されなくなったときに、デフォルト値(Visible)に復元されます。 – CodeNaked

6

はトリガー

中に加えて、スタイルであなたの可視性を設定し、私はDataTriggersと、この奇妙な行動に時々DataTriggerセッターが獲得した何度も遭遇しましたSetterもStyleに定義されていない限り有効になりません。

<Image Visibility="Collapsed"> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Something}" Value="0"> 
        <Setter Property="Visibility" Value="Visible" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    <Image.Style> 
</Image> 

<Image> 
    <Image.Style> 
     <Style TargetType="Image"> 
      <Setter Property="Visibility" Value="Collapsed" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Something}" Value="0"> 
        <Setter Property="Visibility" Value="Visible" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    <Image.Style> 
</Image> 

編集]を動作します動作しません。これが動作しない理由の説明のためにthe accepted answerを参照してください。これは、依存関係プロパティが決定される順序と関係しており、<Tag>で定義されているプロパティが常にトリガされた値よりも優先されます。

0

トリガーがtrueの場合、値が目的の値に変更されます。それがもはや真でない場合、値を前の値に戻します。それはそれが価値のないものに変わることはありません。

これは、元の値が表示され、それを可視に変更すると、トリガーがアクティブでなくなったときに値が再び表示に戻ります。

+0

サンプルの元の値は表示されず、非表示になっています。 – CodeNaked

+0

はい、問題に関する残りのコメントを読む必要があります。彼はイメージ自体に設定されたプロパティでテストしました(データトリガでは変更できません)。デフォルト以外のコントロールでテストしましたが、トリガ隠しでテストしました。デフォルトが表示されているので、データトリガーが機能する唯一の方法は最後のケースです。それ以外の場合は、デフォルトで表示され、トリガーは何も行いません。 – mydogisbox

関連する問題