Windows窗体组合框中的一点点复杂数据绑定

时间:2018-07-19 08:32:52

标签: c# winforms data-binding combobox two-way-binding

在Windows窗体中进行数据绑定时遇到麻烦。我有两个类,一个是Project,另一个是Update。现在,所有项目对象都具有更新列表,并且已绑定到组合框,但是当用户更改选择时,需要显示/绑定更新对象的属性到另一个控件。但是当用户更改选择时未按预期更新。请帮助我。

Screenshot

在下面查看我的课程和代码

public class Project
{
    private int _id;
    private string _name;

    public Project(int id, string name)
    {
        _id = id;
        _name = name;

        ReadUpdates();
    }

    public List<Update> AvailableUpdates { get; set; }
    public int Id { get { return _id; } }

    public string ProjName
    {
        get { return _name; }
        set { _name = value; }
    }

    private void ReadUpdates()
    {
        AvailableUpdates = new List<Update>();

        for (int i = 0; i < 10; i++)
        {
            AvailableUpdates.Add(new
                Update(i, DateTime.Now.AddDays(i)));
        }
    }
}

public class Update
{
    private string _title;
    private int _uid;
    private DateTime _updatedOn;

    public Update(int id, DateTime updatedOn)
    {
        _title = $"Update:{id}";
        _uid = id;
        _updatedOn = updatedOn;
    }

    public string Title
    {
        get { return _title; }
        set { _title = value; }
    }

    public int UId
    {
        get { return _uid; }
        set { _uid = value; }
    }

    public DateTime UpdatedOn
    {
        get { return _updatedOn; }
        set { _updatedOn = value; }
    }
}

public partial class Form1 : Form
{
    private Update _currentUpdate;
    private Project _project;

    public Form1()
    {
        InitializeComponent();

        _project = new Project(1, "Sample Project");

        DoBindings();
    }

    private void DoBindings()
    {
        NameBox.DataBindings.Add("Text", _project, "ProjName");
        IdBox.DataBindings.Add("Text", _project, "Id");

        UpdatesCombo.DataSource = _project.AvailableUpdates;
        UpdatesCombo.DisplayMember = "UId";

        _currentUpdate = (Update)UpdatesCombo.SelectedItem;

        UpdateTitle.DataBindings.Add("Text", _currentUpdate, "Title");
        UpdateDate.DataBindings.Add("Value", _currentUpdate, "UpdatedOn");
    }

    private void UpdatesCombo_SelectionChangeCommitted(object sender, System.EventArgs e)
    {
        _currentUpdate = (Update)UpdatesCombo.SelectedItem;
    }
}

如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:2)

这很简单。您所需要做的就是将相关控件绑定到与组合框相同的列表数据源。

var updates = _project.AvailableUpdates;

UpdatesCombo.DataSource = updates;
UpdatesCombo.DisplayMember = "UId";

UpdateTitle.DataBindings.Add("Text", updates, "Title");
UpdateDate.DataBindings.Add("Value", updates, "UpdatedOn");

数据绑定基础结构为每个唯一列表数据源创建CurrencyManager类。非列表控件实际上绑定到Current属性,该属性通过组合框选择进行更新。