【问题标题】:Little complex Databinding in windows form comboboxWindows表单组合框中的小复杂数据绑定
【发布时间】:2018-12-27 07:31:01
【问题描述】:

我在 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;
    }
}

如果我错了,请纠正我。

【问题讨论】:

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


    【解决方案1】:

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

    var updates = _project.AvailableUpdates;
    
    UpdatesCombo.DataSource = updates;
    UpdatesCombo.DisplayMember = "UId";
    
    UpdateTitle.DataBindings.Add("Text", updates, "Title");
    UpdateDate.DataBindings.Add("Value", updates, "UpdatedOn");
    

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

    【讨论】:

    • 我会将Update 类(目前的名字不太好)作为子类移动到 Project(也不是一个好名字)中。
    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 2017-02-27
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2012-01-24
    相关资源
    最近更新 更多