2014-02-21 45 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,没有运气。 –