2017-01-15 5 views
0

データバインディングとトリガーを使用して、ユーザーがサーバーに接続しているかどうかを示すステータスバーがあります。私は色の背景(赤、緑、黄色)を設定する実際のStatusBarItemと、テキストを表示するためのTextBlock( "Not Connected"、 "Connected"など)の2つの異なる要素をスタイリングしています。重複するDataTriggerロジックを削除する

<StatusBarItem Grid.Column="0" HorizontalAlignment="Left" Padding="10,0,10,0"> 
    <StatusBarItem.Style> 
     <Style TargetType="StatusBarItem"> 
      <Setter Property="Background" Value="Red" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.NotConnected}"> 
        <Setter Property="Background" Value="Red" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.Connected}"> 
        <Setter Property="Background" Value="Green" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.OfflineMode}"> 
        <Setter Property="Background" Value="Goldenrod" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </StatusBarItem.Style> 
    <TextBlock Width="Auto" Height="Auto"> 
     <TextBlock.Style> 
      <Style TargetType="TextBlock"> 
       <Setter Property="Text" Value="Not Connected" /> 
       <Setter Property="Foreground" Value="White" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.NotConnected}"> 
         <Setter Property="Text" Value="Not Connected" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.Connected}"> 
         <Setter Property="Text" Value="Connected to Perforce" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.OfflineMode}"> 
         <Setter Property="Text" Value="Offline Mode" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </TextBlock.Style> 
    </TextBlock> 
</StatusBarItem> 

質問:XAMLでこれをやってmが、私はそうのように、(1、別のテキストに背景を更新するために)2つのスタイルを越えDataTriggerロジックを複製する必要があり、このコードを圧縮することであるが道であり、 DataTriggerロジックを複製しないでください。

私は、TextBlockがStatusBarItem全体に記入するソリューションには興味がありません。確かに、それはこの特定の問題を解決するだろう(私はちょうど背景色とテキストの両方のTextBlockをスタイルするだろう)。しかし、それは大きな問題(2つの場所で更新されなければならない重複コード)には対処していません。

答えて

1

は、この特定のケースでは、StatusBarItemスタイルでDataTriggersを使用しての代わりに、コンテンツとして明示のTextBlockを使用してContentプロパティを設定できます

<StatusBarItem Grid.Column="0" HorizontalAlignment="Left" Padding="10,0,10,0"> 
    <StatusBarItem.Style> 
     <Style TargetType="StatusBarItem"> 
      <Setter Property="Background" Value="Red" /> 
      <Setter Property="Content" Value="Not Connected" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.NotConnected}"> 
        <Setter Property="Background" Value="Red" /> 
        <Setter Property="Content" Value="Not Connected" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.Connected}"> 
        <Setter Property="Background" Value="Green" /> 
        <Setter Property="Content" Value="Connected to Perforce" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Path=ConnectionStatus}" Value="{x:Static local:EConnectionStatus.OfflineMode}"> 
        <Setter Property="Background" Value="Goldenrod" /> 
        <Setter Property="Content" Value="Offline mode" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </StatusBarItem.Style> 
</StatusBarItem> 

別のオプションは、のために独自のカスタムのControlTemplateを定義することですStatusBarItemを使用し、ControlTemplate.Triggersを使用して背景とテキストを1か所で変更します。

+0

ありがとうございました。これは間違いなくここに掲載された特定の問題に役立ちますが、ソリューションはすべての一般的な意味で重複するトリガーコードを排除するソリューションを提示しません。はい、ここでTextBlockを取り除き、StatusBarItemでテキストをまっすぐに設定できます。そして、私はカスタムコントロールを書くことができます(これは良い、より一般的な考えです)。 2つの全く関係のない要素に同じトリガロジックがある場合、私は何をしますか? DataTriggersをコピー/ペーストする必要がありますか?それは私が解決しようとしている本当のQです。 – Drakestar

+1

これは、このQが答えられたことをマークし、2つの要素を統合するか、単一のカスタムコントロールを作成することで解決できない例を使用して新しいものを投稿するのが理にかなっていると思います。 – Drakestar