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;

DisplayMemberValueMember 已在 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();