ComboBox 已设置 DataSource 但未显示任何项目
ComboBox has DataSource set but is not displaying any items
我有一个带有 ComboBox DisplayBox
的 windows 表格。在我的 ViewModel
中,我现在有一个要绑定到 DisplayBox
.
的 属性 BindingList<MyObject> ObjectBindingList
当我加载表单时,DisplayBox
没有显示任何文本。
属性 DataSource
被设置并保存 MyObjects
的列表,当检查数据下载后的调试模式时。
属性 项的计数始终为零。
我的代码如下:
启动时,我将 class 形式的数据绑定设置为仍然为空的列表 ObjectBindingList。
displayBox.DataSource = ObjectBindingList;
DisplayMember
和 ValueMember
已在 GUI 设计器的 ComboBox 属性中设置。
controller
异步下载一些数据 (MyDataObjects)。然后通过添加它们将 ViewModel 中的 BindingList<MyObject> ObjectBindingList
设置为下载的对象。
似乎在尝试从与主窗体线程不同的线程更新 ComboBox 时,更新没有到达控件。
我现在在绑定列表和控件之间使用 Invoke 方法和 BindingSource 对象。
private void SetBindingSourceDataSource( BindingList<MyObject> myBindingList)
{
if (InvokeRequired)
{
Invoke(new Action<BindingList<MyObject>>(SetBindingSourceDataSource), myBindingList);
}
else {
this.BindingSource.DataSource = myBindingList;
}
}
我特别想在每次调用下载函数结束时触发的 PropertyChanged 事件上调用上述函数。
由于我没有看到所有相关代码,所以我只能假设发生了什么。
您可能没有在 ComboBox 中看到数据,因为您在加载数据时创建了一个新的 BindingList。但是 ComboBox 仍然附加到旧的空列表。
您使用这样的空列表初始化数据源:
// Property
BindingList<MyObject> ObjectBindingList { get; set; }
其他地方
// Initializes data source with an empty `BindingList<MyObject>`.
ObjectBindingList = new BindingList<MyObject>();
displayBox.DataSource = ObjectBindingList;
稍后,您加载数据并替换列表:
ObjectBindingList = LoadData();
现在,您有两个列表:分配给 displayBox.DataSource
的初始空列表和分配给 属性 ObjectBindingList
的新填充列表。请注意 displayBox.DataSource
没有对 属性 本身的引用,因此它看不到 属性.
的新值
要使 BindingList<T>
正常工作,您必须添加具有
的项目
var records = LoadData();
foreach (var data in records) {
ObjectBindingList.Add(data);
}
即保持原来的BindingList<MyObject>
分配给数据源。
另请参阅:
为了避免这个问题,我建议将 属性 设为只读(使用 C# 9.0 的 Target-typed new expressions)。
BindingList<MyObject> ObjectBindingList { get; } = new();
我有一个带有 ComboBox DisplayBox
的 windows 表格。在我的 ViewModel
中,我现在有一个要绑定到 DisplayBox
.
BindingList<MyObject> ObjectBindingList
当我加载表单时,DisplayBox
没有显示任何文本。
属性 DataSource
被设置并保存 MyObjects
的列表,当检查数据下载后的调试模式时。
属性 项的计数始终为零。
我的代码如下:
启动时,我将 class 形式的数据绑定设置为仍然为空的列表 ObjectBindingList。
displayBox.DataSource = ObjectBindingList;
DisplayMember
和 ValueMember
已在 GUI 设计器的 ComboBox 属性中设置。
controller
异步下载一些数据 (MyDataObjects)。然后通过添加它们将 ViewModel 中的 BindingList<MyObject> ObjectBindingList
设置为下载的对象。
似乎在尝试从与主窗体线程不同的线程更新 ComboBox 时,更新没有到达控件。 我现在在绑定列表和控件之间使用 Invoke 方法和 BindingSource 对象。
private void SetBindingSourceDataSource( BindingList<MyObject> myBindingList)
{
if (InvokeRequired)
{
Invoke(new Action<BindingList<MyObject>>(SetBindingSourceDataSource), myBindingList);
}
else {
this.BindingSource.DataSource = myBindingList;
}
}
我特别想在每次调用下载函数结束时触发的 PropertyChanged 事件上调用上述函数。
由于我没有看到所有相关代码,所以我只能假设发生了什么。
您可能没有在 ComboBox 中看到数据,因为您在加载数据时创建了一个新的 BindingList。但是 ComboBox 仍然附加到旧的空列表。
您使用这样的空列表初始化数据源:
// Property
BindingList<MyObject> ObjectBindingList { get; set; }
其他地方
// Initializes data source with an empty `BindingList<MyObject>`.
ObjectBindingList = new BindingList<MyObject>();
displayBox.DataSource = ObjectBindingList;
稍后,您加载数据并替换列表:
ObjectBindingList = LoadData();
现在,您有两个列表:分配给 displayBox.DataSource
的初始空列表和分配给 属性 ObjectBindingList
的新填充列表。请注意 displayBox.DataSource
没有对 属性 本身的引用,因此它看不到 属性.
要使 BindingList<T>
正常工作,您必须添加具有
var records = LoadData();
foreach (var data in records) {
ObjectBindingList.Add(data);
}
即保持原来的BindingList<MyObject>
分配给数据源。
另请参阅:
为了避免这个问题,我建议将 属性 设为只读(使用 C# 9.0 的 Target-typed new expressions)。
BindingList<MyObject> ObjectBindingList { get; } = new();