如何在DataTrigger中使用预定义的样式

时间:2017-02-16 19:05:55

标签: c# xaml styles datatrigger

在我的项目中,我有多个强制性的不同控件。为了让用户知道需要一个字段,我使用DataTrigger在字段上设置了红色轮廓。

这是一个必填字段的TextBox:

<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" />

1 个答案:

答案 0 :(得分: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}
    />