ComboBox:样式内容取决于 属性 状态

ComboBox: Style content depending on property state

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

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

我想创建一个简单的 Path 类型的硬编码列表,仅供学习之用,然后填充 ComboBox。我想创建三个 ID 递增的路径对象,通过分配 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>

您应该编写一个 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>