【问题标题】:Reflect changes from BindingList.List.Element between controls and the Bindinglist在控件和 Bindinglist 之间反映来自 BindingList.List.Element 的更改
【发布时间】:2017-02-22 10:46:58
【问题描述】:

我有一个BindingListobjectAs 绑定到comboBox_1.DataSource(对象名称为DisplayMember)。我的objectAobjectZobjectXs 的列表组成。该表单连接到该objectXs 列表中的一个特定元素。此表单上还有许多其他控件,它们显示 objectX 的不同属性的值。
下面是一些可视化的代码:

class objectA
{
    class objectZ
    {
        public int Count { get; set; }
    }
    class objectX
    {
        public string Prop1 { get; set; }
        public bool Prop2 { get; set; }
    }

    public string Name { get; set; }
    public objectZ Z { get; set; }
    public List<objectX> listX { get; set; }
}

BindingList<objectA> listA = new BindingList<objectA>();
comboBox_1.DataSource = listA;
comboBox_1.DisplayMember = "Name";

如何使其他控件中的objectX 值更改以反映comboBox 中当前选择的值,同时保留“on-the-go”读取/写入数据的BindingList 属性?用代码表达它(也就是我想要实现的目标):

textBox_1.Text = listA.GetWantedObjectX().Prop1;
checkBox_1.Checked = listA.GetWantedObjectX().Prop2;

void checkBox_1_CheckedChanged()
{
    listA.GetWantedObjectX().Prop2 = checkBox_1.Checked;
}

我猜我需要一个 objectA.objectX currentObject 属性来控制数据,然后它会是:

currentObject = listA.GetWantedObjectX();
checkBox_1.Checked = currentObject.Prop2;

但是对currentObject 所做的更改不会反映在listaA 中,我必须创建一个保存按钮之类的东西,对吧?有没有更“响应式”的方式?

【问题讨论】:

    标签: c# winforms data-binding


    【解决方案1】:

    虽然这不是一个很好的解决方案(没有人提供更好的解决方案),但我基本上坚持使用 currentObject 并控制 comboBox1_SelectedIndexChanged 事件中的所有内容。这是代码:

    objectA.objectX currentObject = null;
    int previousObjectIndex = 0;
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (currentObject == null)
        {
            currentObject = listA[comboBox1.SelectedIndex].GetWantedObjectX();
            textBox1.Text = currentObject.Prop1;
        }
        else
        {
            currentObject.Prop1 = textBox1.Text;
    
            if (!listA[previousObjectIndex].listX.Any(x => x.Prop1 == currentObject.Prop1))
                listA[previousObjectIndex].listX.Add(currentObject);
    
            currentObject = listA[comboBox1.SelectedIndex].GetWantedObjectX();
    
            if (currentObject == null)
                currentObject = new objectA.objectX();
    
            previousObjectIndex = comboBox1.SelectedIndex;
    
            textBox1.Text = currentObject.Prop1;
        }
    }
    

    当然这不包括对objectZ 的处理,需要引入类似的机制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      相关资源
      最近更新 更多