[英]Binding ListBox.SelectedItem to Property
這可能是一個重復的問題,但是我找不到很好的答案。 將WinForms ListBox綁定到對象屬性之類的所有答案都不適用於我的WinForm。 我會解釋。
我有一個在ListBox
顯示的公司ListBox
。 我想當SelectedItem更改時,它會更新模型上的屬性。 這樣我就可以讀取Firms屬性。
// the classes
public class Firm
{
public string Name { get; set; }
public int Id { get; set; }
// more properties ...
}
public class MyModel : INotifyPropertyChanged
{
private Firm _firm = new Firm();
public Firm Firm
{
get { return _firm; }
set
{
if (Equals(value, _firm)) return;
_firm = value;
OnPropertyChanged();
}
}
// more properties and OnPropertyChanged() ...
}
// the form
private MyModel Model;
public void MyForm(List<Firm> firms)
{
lstFirm.DataBindings.Add("SelectedItem", Model, "Firm",
true, DataSourceUpdateMode.OnPropertyChanged);
lstFirm.DisplayMember = "Name";
lstFirm.ValueMember = "Id";
lstFirm.DataSource = firms;
}
public void lstFirm_SelectedIndexChanged(object sender, EventArgs e)
{
// Do something with Model.Firm
}
問題是Model.Firm null
。 有人知道在ListBox
和Model
之間進行數據綁定時需要做什么嗎? 我在WinForm上綁定了其他內容(例如將TextBoxes
綁定到String
屬性),這些內容可以很好地工作。
據我所知,您的代碼永遠不會設置Model.Firm ... MyModel的構造函數在哪里? 如果不提供,則除非明確設置,否則Model.Firm將保持為空。 這是一個示例構造函數:
public MyModel(Firm firm)
{
_firm = firm;
}
另外, Equals()
並沒有您認為的那樣。 而不是if (Equals(value, _firm)) return;
,請使用: if (value == _firm) return;
好吧,所以經過一個周末的測試,我發現了。
我在SelectedIndexChanged
事件中進行調試,但尚未在Model.Firm中看到更改。 但是由於SelectedItemChanged
事件只是內部事件,因此我無法使用它,而這就是SelectedItem上的數據綁定將值應用於數據綁定項的地方。
現在為什么改變尚不可見,究其原因是因為SelectedItemChanged
后僅觸發SelectedIndexChanged
執行。 因此在內部ListBox
控件中,它看起來像
this.SelectedIndex = value;
this.SelectedItem = FindItem(value);
this.SelectedIndexChanged(/*values*/);
this.SelectedItemChanged(/*values*/); // Apply databinding changes
因此,在更改發生之前您看不到更改是很正常的。 而且我不知道這一點,所以我很困惑為什么未將SelectedItem(正在顯示更改后的值)復制到數據綁定模型屬性中。
因此,我無需進行任何重大更改即可使其正常運行。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.