2017-02-16 12 views
1

私のプロジェクトでは、複数の異なるコントロールが必須です。フィールドが必要であることをユーザーが知るために、DataTriggerを使用してフィールドに赤いアウトラインを設定します。ここでDataTriggerで事前定義されたスタイルを使用するには

は必須項目ですテキストボックスです:

<TextBox Text="{Binding RationaleForNoInvestigation, UpdateSourceTrigger=PropertyChanged}"> 
       <TextBox.Style> 
       <Style TargetType="TextBox"> 
        <Style.Triggers> 
        <DataTrigger Binding="{Binding RationaleForNoInvestigation, 
Converter={StaticResource IsNullOrEmptyStringConverter}}" 
           Value="True"> 
         <Setter Property="BorderBrush" 
           Value="Red" /> 
         <Setter Property="BorderThickness" 
           Value="1" /> 
        </DataTrigger> 
        </Style.Triggers> 
       </Style> 
       </TextBox.Style> 
      </TextBox> 

そしてここでは、必須フィールドでのコンボボックスである:

<telerik:RadComboBox SelectedItem="{Binding Path=SelectedRoomType, Mode=TwoWay}"> 
    <telerik:RadComboBox.Style> 
     <Style TargetType="telerik:RadComboBox"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=SelectedRoomType, 
Converter={StaticResource IsNullConverter}}" 
         Value="True"> 
      <Setter Property="BorderBrush" 
        Value="Red" /> 
      <Setter Property="BorderThickness" 
        Value="2" /> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </telerik:RadComboBox.Style> 
    </telerik:RadComboBox> 

しかし、私は一日のビジュアルを変更するように決定することができます必要なフィールドの表示、例えば青い背景への指示。 スタイルを使用して手動でプロジェクトを変更するプロジェクトのすべての場所を通過する必要はありません。代わりに、特定のコントロールで参照できるグローバルスタイルを設定し、グローバルスタイルを1か所で変更できるようにしたいと考えています。

上記のコードからこれらの行を引き出し、グローバルな場所に置くにはどうすればよいですか?そして、私は上記のTextBoxとComboBoxでどのように参照しますか?

<Setter Property="BorderBrush" 
          Value="Red" /> 
<Setter Property="BorderThickness" 
          Value="1" /> 

答えて

3

すべてのスタイルを含む別々のXAMLファイルを作成できます。

複数のコントロールを対象にする必要があるため、それぞれのプロパティを変更する必要があるため、それぞれのコントロールに異なるスタイルを作成することをおすすめします。それは次のようになります。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <converters:IsNullConverter x:Key="IsNullOrEmptyStringConverter" /> 

    <!-- I also highly recommend creating the color brush separately, since this enables you to change the color without changing each one of the styles --> 
    <SolidColorBrush Color="Red" x:Key="ErrorBrush" /> 

    <Style x:Key="ValidateTextBoxStyle" TargetType="TextBox"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Text, Source={RelativeSource AncestorType=TextBox}, Converter={StaticResource IsNullOrEmptyStringConverter}}" Value="True"> 
       <Setter Property="BorderBrush" Value="{StaticResouce ErrorBrush}" /> 
       <Setter Property="BorderThickness" Value="1" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

</ResourceDictionary> 

あなたはこのように、あなたのビューのXAMLでこのファイルを参照することができます:あなたが参照している場合、

<MainView.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Styles.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</MainView.Resources> 

この方法で、あなたはどこでもあなたのアプリケーションでは、あなたのスタイルを参照することができますスタイルXAML!

<TextBox 
    Text="{Binding RationaleForNoInvestigation, UpdateSourceTrigger=PropertyChanged}" 
    Style="{StaticResource ValidateTextBoxStyle} 
    /> 
+1

なぜあなたは別のファイルにスタイルを入れることをお勧めしますか?私たちは通常、それらをApp.xamlファイルに入れます。私は別のファイルが別のアプリケーションで再利用できることを知っていますが、このアプリケーションに利点はありますか? –

+1

@AvrohomYisroel私はあなたのアプリケーションのサイズに依存すると思います。たとえば、仕事では少なくとも100種類のXAMLファイルがあります。 1つのファイルでこれらのスタイルをすべて想像してみてください!ローズ氏のケースはおそらく巨大なアプリケーションではないだろうと思うが、だれも知っているのではないだろうか? –

+1

それは助けになりますが、私はいくつかの質問があります。 1.ブラシカラーを別に保存することは賢明です。しかし、緑色の背景のように、スタイルを完全に別のものに変更することにしたらどうなりますか?私はすべての定義されたスタイルでそれを変更する必要があります。 2.トリガーがより複雑なため、これらの定義されたスタイルを使用できない場所がいくつかあります。たとえば、複数の要件を持つフィールドのMultipleDataTriggerが必須ですが、そのスタイルは他のコントロールと同じにする必要があります。 – Rose

関連する問題