【问题标题】:How do I use a pre-defined style in a DataTrigger如何在 DataTrigger 中使用预定义样式
【发布时间】:2017-07-06 01:45:20
【问题描述】:

在我的项目中,我有多个不同的强制控制。为了让用户知道某个字段是必需的,我使用 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" />

【问题讨论】:

    标签: c# xaml styles datatrigger


    【解决方案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}
        />
    

    【讨论】:

    • 为什么建议将样式放在单独的文件中?我们通常将它们放在 App.xaml 文件中。我知道一个单独的文件允许在不同的应用程序中重复使用,但是这个应用程序有什么好处吗?
    • @AvrohomYisroel 我想这取决于您的应用程序的大小。例如,在工作中,我们至少有 100 个不同的 XAML 文件。想象一下所有这些样式都在一个文件中!我猜,Rose 的案子可能不是一个庞大的应用程序,但没有人知道,对吧?
    • 这确实对我有帮助,但我有几个问题: 1. 单独保存画笔颜色很聪明,如果我决定只更改画笔颜色会对我有所帮助。但是,如果我决定将样式完全更改为其他样式,例如在绿色背景中呢?我必须在所有定义的样式中更改它。 2. 有些地方我不能使用这些定义的样式,因为触发器更复杂。例如,我有一个 MultipleDataTrigger 字段,该字段有多个要求使其成为强制性,但其样式应与其他控件相同...
    • @RodrigoVedovato Rose 有一个很好的观点,如果你想制作一个完整的预定义样式怎么办?你将如何使用它?
    猜你喜欢
    • 2017-08-09
    • 2017-01-23
    • 2013-07-10
    • 2020-07-26
    • 2011-10-09
    • 1970-01-01
    • 2010-12-10
    • 2023-01-13
    • 2013-08-11
    相关资源
    最近更新 更多