C# 在WPF中自定义组合框

C# 在WPF中自定义组合框,c#,wpf,list,combobox,C#,Wpf,List,Combobox,我有一张狗和猫的名单。我想在同一个组合框中显示狗和猫的列表。然而,我想区分它们 比如说。在我把狗的列表放进去之前,它应该是一个,让我们用不同的字体颜色称它为“不可选择的项目”,上面写着“狗”,然后是狗的列表。在狗的列表之后,另一个不同字体颜色的“不可选择项”应该是“猫”,然后是猫的列表 有人知道怎么做吗?我一直在寻找,但没有找到一个可以这样做的财产 使用ComboBoxItem作为“标题”条目。例如: ComboBoxItem CBI = new ComboBoxItem(); CBI.Cont

我有一张狗和猫的名单。我想在同一个组合框中显示狗和猫的列表。然而,我想区分它们

比如说。在我把狗的列表放进去之前,它应该是一个,让我们用不同的字体颜色称它为“不可选择的项目”,上面写着“狗”,然后是狗的列表。在狗的列表之后,另一个不同字体颜色的“不可选择项”应该是“猫”,然后是猫的列表


有人知道怎么做吗?我一直在寻找,但没有找到一个可以这样做的财产

使用
ComboBoxItem
作为“标题”条目。例如:

ComboBoxItem CBI = new ComboBoxItem();
CBI.Content = "DOGS";
CBI.IsEnabled = false;
CBI.Background = Brushes.Aqua;
comboBox1.Items.Add(CBI);
//Add dogs here

我建议创建一个猫狗都能实现的界面。然后绑定到这些对象的集合,并使用xaml根据对象的类型更改外观

public enum AnimalType
{
    Dog,
    Cat
}
public interface Animal
{
    AnimalType animal { get; set; }
    string Name { get; set; }
}

public class Cat : Animal
{
    public AnimalType animal { get; set; }
    public string Name { get; set; }

    public Cat()
    {
        animal = AnimalType.Cat;
    }
}


public class Dog : Animal
{
    public AnimalType animal { get; set; }
    public string Name { get; set; }

    public Dog()
    {
        animal = AnimalType.Dog;
    }
}

public class MyViewModel
{
    public List<Animal> MyAnimals { get; set; }

    public MyViewModel()
    {
        MyAnimals = new List<Animal>();

        var a = new Dog();
        var b = new Cat();

        MyAnimals.Add(a);
        MyAnimals.Add(b);
    }
}
公共枚举动物类型
{
狗,
猫
}
公共界面动物
{
AnimalType动物{get;set;}
字符串名称{get;set;}
}
公猫:动物
{
公共动物类型动物{get;set;}
公共字符串名称{get;set;}
公猫
{
动物=动物型。猫;
}
}
公营狗:动物
{
公共动物类型动物{get;set;}
公共字符串名称{get;set;}
公犬()
{
动物=动物型。狗;
}
}
公共类MyViewModel
{
公共列表MyAnimals{get;set;}
公共MyViewModel()
{
MyAnimals=新列表();
var a=新狗();
var b=新的Cat();
添加(a);
添加(b);
}
}
然后在XAML中绑定到列表(或使用可观察集合进行自动道具更新)


然后根据数据创建样式以更改外观

<Style TargetType="ComboBox" x:Key="MyCombo">
                <Style.Triggers>
                    <DataTrigger Binding="AnimalType" Value="Dog">
                        <Setter Property = "Foreground" Value="Green"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>

这是一个糟糕的设计。这是一种双赢的方法。
<Style TargetType="ComboBox" x:Key="MyCombo">
                <Style.Triggers>
                    <DataTrigger Binding="AnimalType" Value="Dog">
                        <Setter Property = "Foreground" Value="Green"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>