【问题标题】:ComboBox: Style content depending on property stateComboBox:样式内容取决于属性状态
【发布时间】:2019-12-16 06:44:39
【问题描述】:

有些帖子可能指向我的问题,但是当我尝试将他们的解决方案应用于我的任务时,我又被其他问题困住了。

所以,我想要一个 ComboBox 来显示我的 Path 类中的一个数字 (PathID)。 Path有一个叫PathState的属性,它是一个枚举,可以是PathState.red、PathState.blue、PathState.green,表示一种颜色。

我想创建一个简单的 Path 类型硬编码列表,仅用于学习,然后填充 ComboBox。我想创建三个 ID 递增的 Path 对象,通过分配 PathState 属性为每个对象赋予不同的颜色。

通过启动应用程序,ComboBox 应包含数字 1、2 和 3,而 1 是红色,2 是绿色,3 是蓝色。

我知道我需要通过 ComboBox.ItemTemplate、DataTemplate 和 DataTrigger 来获得它 - 我只是不知道从哪里开始。

public class Path
{
  public int PathID {get;set;}
  public PathState PathState { get; set;}
}

public enum PathState
{
   red = 0,
   green = 1,
   blue = 2
}

编辑:好的,我已经做了一些努力,但是卡在 DataTrigger-Part 上:这是我的代码:

<ComboBox Name="cmbTest" ItemsSource="{Binding MyPaths}" Grid.Column="1" Grid.Row="1"  VerticalContentAlignment="Center" HorizontalContentAlignment="Center">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock x:Name="cmbText"  Text="{Binding PathId}" Foreground="Red"/>
            </DataTemplate>                
        </ComboBox.ItemTemplate>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=MyPaths}" Value="MyPaths.PathState">
                     <!-- Actually, I don't know how to continue beyond this point) -->
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox>

【问题讨论】:

  • 首先创建一个包含DataTemplateItemTemplate。然后在您的数据模板中定义DataTriggers。您阅读了哪些特定的问题和答案,还有哪些不清楚的地方?
  • 作为初学者,我很难说得更具体——我想我漏掉了一些术语。请看我的编辑;特别是 DataTrigger-segment - 那里找不到我的 TargetName。我希望这将是解释性的。
  • @SelfBiased_Resistor 您能否更具体地说明您想要设置的样式(组合框中的项目,组合框取决于所选项目,其他取决于所选项目,...) ?样式是否取决于组合框是打开还是关闭?您希望选择颜色的行为如何?它是相关的还是你只关心没有重点的项目的颜色?
  • @grek40:实际上我想根据 PathState-property 的状态为 ComboBox-Items 着色(如果设置为红色,则显示项目的颜色应为红色,如果设置为绿色,项目的颜色应该是绿色,等等)。因此,如果您单击组合框并打开它,您应该通过它的颜色来显示项目状态(稍后颜色将代表信息,例如,红色项目代表打开的任务,绿色项目代表已完成的任务等等),

标签: c# wpf combobox datatrigger


【解决方案1】:

您应该编写一个IValueConverter,将您的PathState 转换为相应的System.Windows.Media.Brush。除非您需要特殊的东西,否则请使用预定义的 Brushes(https://docs.microsoft.com/de-de/dotnet/api/system.windows.media.brushes?view=netframework-4.8)。

然后在资源中的某处实例化值转换器(可以在任何父级别,我将它放在ComboBox 中仅用于此示例。然后使用转换器绑定您的颜色以显示属性。

如果您想要Background,请在ItemContainerStyle 内进行。如果你想Foreground 把它放在需要的地方。请注意:我的示例设置了 Foreground=Background,您不会看到太多。

<ComboBox>
    <ComboBox.Resources>
        <local:MyColorConverter x:Key="colorConverter"/>
    </ComboBox.Resources>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding PathID}" Foreground="{Binding PathState,Converter={StaticResource colorConverter}}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
    <ComboBox.ItemContainerStyle>
        <Style TargetType="ComboBoxItem">
            <Setter Property="Background" Value="{Binding PathState,Converter={StaticResource colorConverter}}"/>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

【讨论】:

  • 是的,先生,非常感谢您 - 为我完成了这项工作!
猜你喜欢
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 2018-08-24
  • 2017-01-23
  • 2021-12-12
相关资源
最近更新 更多