是否可以将模型类的属性绑定到 ComboBox

本文关键字:属性 绑定 ComboBox 模型 是否 | 更新日期: 2023-09-27 18:32:04

(注意:我winforms标记它,但我认为它也适用于WPF)

我有一个组合框和一个模型类(假设是人)。人员包含多个公共属性(姓名、年龄、性别、地址等)。

是否有一种(标准)方法可以将 ComboBox 的数据源绑定到这些属性,以便 ComboBox 显示"名称"、"年龄"、"性别"和"地址"作为其列表?

是否可以将模型类的属性绑定到 ComboBox

您的表单:

public partial class Form1 : Form
{
    BindingList<PropertyInfo> DataSource = new BindingList<PropertyInfo>();
    public Form1()
    {
        InitializeComponent();
        comboBox1.DataSource = new BindingList<PropertyInfo>(typeof(Person).GetProperties());
        // if want to specify only name (not type-name/property-name tuple)
        comboBox.DisplayMember = "Name";
    }
}

您的班级:

public class Person
{
    public string Name { get; set; }
    public uint Age { get; set; }
    public bool Sex { get; set; }
    public string Adress { get; set; }
}

若要获取属性名称,请使用反射:

var propertyNames = person
    .GetType() // or typeof(Person)
    .GetProperties()
    .Select(p => p.Name)
    .ToArray();

(由于所有Person实例的结果都相同,因此我会缓存它,例如在静态变量中)。

若要在组合框中显示属性,请使用DataSource (WinForms):

comboBox.DataSource = propertyNames;

ItemsSource (WPF):

<ComboBox ItemsSource="{Binding PropertyNames}"/>

(假设当前数据上下文包含公共属性PropertyNames)。

在 WPF 中:

public class Person
{
    public string Name { get; set; }
    public int? Age { get; set; }
    public string Sex { get; set; }
    public string Address { get;set;}
    public override string ToString()
    {
        return string.Format("{0}, {1}, {2}, {3}", Name, Age, Sex, Address);
    }
}
public class PersonViewModel
{
    public PersonViewModel()
    {
        PersonList = (from p in DataContext.Person
                      select new Person
                      {
                          Name = p.Name,
                          Age = p.Age,
                          Sex = p.Sex,
                          Address = p.Address
                      }).ToList();
    }
    public List<Person> PersonList { get; set; }
    public Person SelectedPerson { get; set; }
}

XAML:

<ComboBox ItemsSource="{Binding PersonList}" SelectedItem="{Binding SelectedPerson}"/>