簡體   English   中英

將ListBox.SelectedItem綁定到屬性

[英]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 有人知道在ListBoxModel之間進行數據綁定時需要做什么嗎? 我在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM