这可能是一个重复的问题,但我无法找到一个好的答案。像Binding WinForms ListBox to object properties这样的所有答案都不适用于我的WinForm。我会解释一下。
我有一个我在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
属性),这些工作很好。
答案 0 :(得分:2)
从我所看到的,你的代码永远不会设置Model.Firm ...... MyModel的构造函数在哪里?如果您不提供一个,Model.Firm将保持为null,除非您明确设置它。这是一个示例构造函数:
public MyModel(Firm firm)
{
_firm = firm;
}
此外,Equals()
没有按照您的想法执行。请使用以下代码if (Equals(value, _firm)) return;
,而不是if (value == _firm) return;
答案 1 :(得分: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(显示更改后的值)没有被复制到数据绑定模型属性。
所以我没有必要改变任何重要的东西来使它全部工作。 :)