将ListBox.SelectedItem绑定到Property

时间:2014-02-21 12:47:10

标签: c# winforms data-binding listbox selecteditem

这可能是一个重复的问题,但我无法找到一个好的答案。像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。有没有人知道我需要做什么才能在ListBoxModel之间进行数据绑定?我将其他东西绑定在我的WinForm上(例如TextBoxesString属性),这些工作很好。

2 个答案:

答案 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(显示更改后的值)没有被复制到数据绑定模型属性。

所以我没有必要改变任何重要的东西来使它全部工作。 :)