BindingList с моим классом, заполняющим ComboBox, используя его свойство? - PullRequest
2 голосов
/ 29 мая 2011

У меня есть класс BindingList, в котором я хотел бы заполнить ComboBox, используя его свойство, поэтому при изменении моего списка ComboBox также будет меняться.

public class UserAccess
{
    public override string ToString()
    {
        return Access;
    }
    public int AccessId { get; set; }
    public string Access { get; set; }
    public List<string> Command = new List<string>();

    public bool HasCommand(string cmd)
    {
        return this.Command.Any(x => x == cmd);
    }
}

public BindingList<UserAccess> accessList = new BindingList<UserAccess>();

При загрузке формы я назначаю ее в ComboBox:

myComboBox.DataSource = accessList;

Я хочу заполнить поле Access или AccessId в качестве значения и Access в качестве напечатанного имени.

Проблема в том, что он будет печатать только последний элемент списка в поле со списком, что я делаю не так?

1 Ответ

3 голосов
/ 29 мая 2011

Используйте DisplayMember, чтобы указать, какое поле использовать для отображения в ComboBox.
Сделать accessList readonly, чтобы гарантировать, что вы никогда не создадите новый экземпляр списка.Если вы не сделаете это readonly, это может привести к незначительной ошибке, если вы не переназначаете DataSource всякий раз, когда вы заново создаете accessList.

private readonly BindingList<UserAccess> accessList = new BindingList<UserAccess>();

public Form1()
{
    InitializeComponent();

    comboBox1.ValueMember = "AccessId";
    comboBox1.DisplayMember = "Access";
    comboBox1.DataSource = accessList;
}

private void button1_Click(object sender, EventArgs e)
{
    accessList.Add(new UserAccess { AccessId = 1, Access = "Test1" });
    accessList.Add(new UserAccess { AccessId = 2, Access = "Test2" });
}

Если вам нужно иметь возможностьизмените свойства элементов в accessList (например, accessList[0].Access = "Test3") и просмотрите изменения, отраженные в пользовательском интерфейсе, вам нужно реализовать INotifyPropertyChanged.

Например:

public class UserAccess : INotifyPropertyChanged
{
    public int AccessId { get; set; }

    private string access;

    public string Access
    {
        get
        {
            return access;
        }

        set
        {
            access = value;
            RaisePropertyChanged("Access");
        }
    }

    private void RaisePropertyChanged(string propertyName)
    {
        var temp = PropertyChanged;
        if (temp != null)
            temp(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...