我的类有一个 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>();
在加载表单时,我将其分配给组合框:
myComboBox.DataSource = accessList;
我想用 Access 或 AccessId 作为值和 Access 作为打印名称来填充框。
问题是它只会将列表的最后一项打印到组合框,我做错了什么?
最佳答案
使用 DisplayMember
指定要在 ComboBox
中显示的字段。
使 accessList
readonly
以保证您永远不会重新创建列表的新实例。如果您不将其设置为readonly
,这可能会引入一个微妙的错误,如果您在重新创建 accessList
时不重新分配 DataSource
。
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"
)并查看反射(reflect)在 UI 中的更改,您需要实现 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;
}
关于c# - BindingList 与我的类使用它的属性填充 ComboBox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6164264/