我有一個帶有ComboBox DisplayBox的windows表單。在我的ViewModel中,我現在有一個屬性BindingList<MyObject>ObjectBindingList,我想將其系結到DisplayBox。
當我加載表單時,DisplayBox并沒有顯示任何文本。
屬性DataSource被設定并持有一個MyObjects的串列,當在資料下載后的除錯模式下檢查時。
屬性項的數量總是為零。
我的代碼作業如下。
我的代碼作業原理如下:
在啟動時,我設定了MyObjects。
在啟動時,我將表單類中的資料系結設定為一個仍然是空的List ObjectBindingList。
displayBox.DataSource = ObjectBindingList;
DisplayMember和ValueMember被設定在GUI設計器的ComboBox屬性中。
異步的controller下載一些資料(MyDataObjects)異步的。然后通過添加ViewModel中的BindingList<MyObject>ObjectBindingList到下載的物件上。
uj5u.com熱心網友回復:
當試圖從與主表單執行緒不同的執行緒中更新 ComboBox 時,更新沒有到達控制元件。 我現在在系結串列和控制元件之間使用Invoke方法和一個BindingSource物件。
private void SetBindingSourceDataSource( BindingList< MyObject> myBindingList)。
{
if (InvokeRequired)
{
Invoke(new Action<BindingList<MyObject>>(SetBindingSourceDataSource),myBindingList)。
}
else {
this.BindingSource.DataSource = myBindingList;
}
}
我想在一個PropertyChanged事件上呼叫上述函式,我在每次呼叫下載函式結束時都會觸發這個事件。
uj5u.com熱心網友回復:
由于我沒有看到所有的相關代碼,我只能假設正在發生什么。
很可能,你沒有看到 ComboBox 中的資料,因為你在加載資料時正在創建一個新的 BindingList。但是 ComboBox 仍然連接到舊的空串列。
你用一個空的串列來初始化資料源,就像這樣:
你用一個空的串列來初始化資料源。
// property
BindingList<MyObject> ObjectBindingList { get; set; }
在其他地方
//用一個空的`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>分配給資料源。
請參見。如何提高自定義BindingList的AddRange方法的性能?
為了避免這個問題,我建議讓這個屬性變成只讀(使用C# 9.0的目標型別的新運算式)。
BindingList<MyObject> ObjectBindingList { get; } = new();
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/309159.html
標籤:
上一篇:**ReactNativeMaps**-如何在標記上按下放大?
下一篇:使用DLL的問題
