如何在 DataTrigger 中使用预定义样式
How do I use a pre-defined style in a 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" />
您可以创建一个包含所有样式的单独的 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}
/>
在我的项目中,我有多个不同的强制性控件。为了让用户知道某个字段是必需的,我使用 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" />
您可以创建一个包含所有样式的单独的 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}
/>