2017-02-16 45 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> 

不過,我可能有一天決定改變視覺而是指示一個必填字段,而不是藍色背景。 我不想在我的項目中使用樣式並手動更改它的所有地方。相反,我想設置一個全局風格,我可以在特定控件中引用它,然後可以在一個地方更改全局風格。

如何從上面的代碼中提取這些代碼並放到全局位置?我怎麼會在上面的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文件。想象一下只有一個文件中的所有樣式!我猜Rose的情況可能不是一個巨大的應用程序,但沒有人知道,對吧? –

+1

這對我有幫助,但我有幾個問題: 1.分開保存筆刷顏色非常聰明,如果我決定改變筆刷顏色,它將對我有所幫助。但是,如果我決定將風格完全改變爲其他風格,如在綠色背景中呢?我將不得不改變所有定義的樣式。 2.有些地方我不能使用這些定義的樣式,因爲觸發器更復雜。例如,我有一個MultipleDataTrigger字段,它有多個要求使其成爲強制性的,但它的風格應該與其他控件相同... – Rose

相關問題