【问题标题】:Binding ListBox.SelectedItem to Property将 ListBox.SelectedItem 绑定到属性
【发布时间】:2014-03-22 23:53:23
【问题描述】:

这可能是一个重复的问题,但我无法找到一个好的答案。 Binding WinForms ListBox to object properties 之类的所有答案都不适用于我的 WinForm。我会解释的。

我有一份在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 属性),这些都很好用。

【问题讨论】:

    标签: c# winforms data-binding listbox selecteditem


    【解决方案1】:

    据我所知,您的代码从未设置 Model.Firm... MyModel 的构造函数在哪里?如果您不提供,则 Model.Firm 将保持为空,除非您明确设置它。这是一个示例构造函数:

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

    另外,Equals() 并没有按照你的想法去做。而不是if (Equals(value, _firm)) return;,使用这个:if (value == _firm) return;

    【讨论】:

    • 私有公司 _firm = new Firm();也是一个有效的解决方案
    • 我已经向我的构造函数添加了一个默认公司,并且我已经修改了设置器。 (默认 Resharper 实现,没有考虑 Equals 与比较器。)但是唉,没有运气。
    【解决方案2】:

    好的,经过一个周末的测试,我想通了。

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

    因此,我无需进行任何重大更改即可使其全部正常运行。 :)

    【讨论】:

      猜你喜欢
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多