2014-02-21 109 views
1

這可能是一個重複的問題,但我無法找到一個好的答案。所有的答案如Binding WinForms ListBox to object properties都不適用於我的WinForm。我會解釋。綁定ListBox.SelectedItem屬性

我有一個公司名單,我在ListBox顯示。我希望SelectedItem發生更改時,它會更新模型上的屬性。這樣我可以閱讀公司的財產。

// 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上的其他東西(如TextBoxesString屬性)和那些很好地工作。

回答

0

好吧,所以經過一個週末的測試,我想通了。

我在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(誰顯示更改的值)沒有被複制到數據綁定模型屬性。

所以我沒有改變任何重要的東西來讓它工作。 :)

2

從我所看到的,你的代碼永遠不會設置Model.Firm ... MyModel的構造函數在哪裏?如果你沒有提供,Model.Firm將保持爲空,除非你明確地設置它。下面是一個例子構造:

public MyModel(Firm firm) 
{ 
    _firm = firm; 
} 

此外,Equals()沒有做什麼,你認爲它。而不是if (Equals(value, _firm)) return;,使用這個:if (value == _firm) return;

+0

private firm _firm = new Firm();也是一個有效的解決方案 – Schuere

+0

我已經向我的構造函數添加了一個默認公司,並且我修改了這些設置器。 (默認的Resharper實現,沒有考慮Equals vs comparer。)但是,allas,沒有運氣。 –