在WPF中自定义组合框
问题描述:
我有一个狗列表和一个猫列表。我想要显示同一个组合框中的狗和猫的列表。但是我想区分它们。在WPF中自定义组合框
例如。在我列出狗的名单之前,它应该出现一个,我们称之为“不可选项目”,用不同的字体颜色表示“DOGS”,然后是狗列表。在狗的列表之后,另一种“不可选择的项目”以不同的字体颜色显示“CATS”,然后显示猫的列表。
有谁知道如何做到这一点?我一直在寻找,一直没有找到一个可以做到这一点的财产。
答
使用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);
}
}
然后在你的XAML绑定到列表(或使用自动更新的道具观察的集合)
<ComboBox ItemsSource="{Binding Path=MyAnimals}" Style="{StaticResource MyCombo}">
,然后创建一个样式以更改基于数据的外观。
<Style TargetType="ComboBox" x:Key="MyCombo">
<Style.Triggers>
<DataTrigger Binding="AnimalType" Value="Dog">
<Setter Property = "Foreground" Value="Green"/>
</DataTrigger>
</Style.Triggers>
</Style>
这是一个糟糕的设计。这是一种胜利形式的方法。 – tsells