根据数据对象属性使用数据模板设置颜色样式

Posted

技术标签:

【中文标题】根据数据对象属性使用数据模板设置颜色样式【英文标题】:Set color style using data template according to data object property 【发布时间】:2021-10-30 19:00:11 【问题描述】:

我有一个包含字符串消息和状态枚举的数据对象。 我的目标是根据状态值设置文本块的颜色。

数据模板:

<DataTemplate DataType="x:Type interfaces_general1:AnalogPinData" x:Key="analogSignalTestTemplate">
            <StackPanel Orientation="Horizontal">
                <TextBlock Width="135"  Text="Binding Path=ThresholdDescriptor.Message" Style="StaticResource colorfulTextBlockStyleAnalogPin" />
            </StackPanel>
</DataTemplate>

风格

        <Style TargetType="x:Type TextBlock" BasedOn="StaticResource emphasizableTextBlock" x:Key="colorfulTextBlockStyleAnalogPin">
            <Style.Triggers>
                <DataTrigger Binding="Binding RelativeSource=RelativeSource /*need to get here to a data object property*/, Path=??" Value="Info">
                    <Setter Property="Foreground" Value="Green" />
                </DataTrigger>
                <DataTrigger Binding="Binding RelativeSource= /*need to get here to a data object property*/, Path=Text" Value="Warning">
                    <Setter Property="Foreground" Value="Orange" />
                </DataTrigger>
            </Style.Triggers>
        </Style>

我怎样才能绑定到状态属性

数据对象是:

public class AnalogPinData

    /// <summary>
    /// Pin information
    /// </summary>
    [PublicAPI]
    public AnalogPin Pin  get; set; 

    /// <summary>
    /// Threshold definition information
    /// </summary>
    [PublicAPI]
    public ThresholdDescriptor ThresholdDescriptor  get; set; 


public class ThresholdDescriptor

    public Range Range  get; set; 

    [PublicAPI]
    public StatusIndicator Status  get; set; 

    [PublicAPI]
    public string Message  get; set; 

我需要在绑定中设置 Message 和 Status 道具。

谢谢!

【问题讨论】:

【参考方案1】:

由于模板数据类型的实例是DataTemplateDataContext,而TextBlock 是此模板中的一个元素,TextBlock 将隐式继承此DataContextDataContext TextBlockAnalogPinData 的实例。

因此绑定到TextBlock 元素的DataContext 解决了这个问题:

<Style TargetType="TextBlock">
  <Style.Triggers>
    <DataTrigger Binding="Binding ThresholdDescriptor.Status" Value="Info">
      <Setter Property="Foreground" Value="Green" />
    </DataTrigger>
  </Style.Triggers>
</Style>

或者直接在 DataTemplate 中定义触发器:

<DataTemplate DataType="x:Type interfaces_general1:AnalogPinData" x:Key="analogSignalTestTemplate">
  <TextBlock x:Name="StatusMessageTextBlock" Text="Binding Path=ThresholdDescriptor.Message" />

  <DataTemplate.Triggers>
    <DataTrigger Binding="Binding ThresholdDescriptor.Status" Value="Info">
      <Setter TargetName="StatusMessageTextBlock" Property="Foreground" Value="Green" />
    </DataTrigger>
  </DataTemplate.Triggers>
</DataTemplate>

【讨论】:

以上是关于根据数据对象属性使用数据模板设置颜色样式的主要内容,如果未能解决你的问题,请参考以下文章

从 Thymeleaf 中的模型对象设置 CSS 变量

根据具体对象的 Color 属性设置 WPF DataGridRow 背景颜色

Mapgis地图颜色配置(专题图配置)----对比Arcgis根据属性配置图斑颜色

easyexcel模板填充样式失效

更改 NumberPicker 的文本颜色

雷林鹏分享:jQuery EasyUI 数据网格 - 条件设置行背景颜色