有些帖子可能指出了我的问题,但是当我尝试将其解决方案应用于任务时,我又被其他问题所困扰。
因此,我希望ComboBox显示我的Path类中的数字(PathID)。 Path具有一个称为PathState的属性,该属性是一个枚举,可以是PathState.red,PathState.blue,PathState.green(表示颜色)。
我想创建一个简单的Path类型的硬编码列表,仅用于学习,然后填充ComboBox。我想创建三个ID递增的Path对象,并通过分配PathState属性为每个对象提供不同的颜色。
通过启动应用程序,组合框应由数字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
。除非您有特殊要求,否则请使用预定义的ComboBox
(https://docs.microsoft.com/de-de/dotnet/api/system.windows.media.brushes?view=netframework-4.8)。
然后在资源中的某个地方实例化值转换器(可以在任何父级,在此示例中,我仅将其放在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>