【问题标题】:Two-Way databinding dynamic object on winform controlswinform控件上的双向数据绑定动态对象
【发布时间】:2013-12-12 04:05:59
【问题描述】:

我想将动态对象数据绑定到 winform 应用程序中的控件。到目前为止,我得到了一些工作,它似乎是“第一次”数据绑定,但是当我更改属性值时,它不会对绑定的控件生效,这就是我可以解决的问题不要克服。

这是代码,如果你创建一个带有文本框和按钮的新 winform 应用程序,你可以对其进行测试:

public partial class Form1 : Form
    {
        public dynamic ViewData { get; set; }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            this.ViewData = new ExpandoObject();

            this.ViewData.Test = "test1";

            var bind = new Binding("Text", this.ViewData, null);
            bind.Format += (o, c) => c.Value = this.ViewData.Test;
            bind.Parse += (o, c) => this.ViewData.Test = c.Value;
            textBox1.DataBindings.Add(bind);

            this.ViewData.Test = "test2";

        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.ViewData.Test = "test3";
        }
    }

作为记录,如果我更改控件值,它会反映在动态属性上,这也可以。

为了完整起见,This post 给了我这种方法。

【问题讨论】:

    标签: c# winforms data-binding inotifypropertychanged expandoobject


    【解决方案1】:

    简单地说,Binding 无法响应您的 DataSource 的属性更改,因为它不知道它需要侦听的属性名称,因为 Binding 的构造函数(第三个参数)中未提供属性名称 - 设计使然。

    为了克服这个问题,基本上,我们需要监听 DataSource 的变化,并通知或强制 Binding 再次读取值。幸运的是,Binding 类有一个公共方法 ReadValue,它强制 Binding 再次从 DataSource 中读取值。

    如果您使用以下行扩展您的代码,例如在将绑定添加到 DataBindings 集合之前,可以解决双向绑定。

    ((INotifyPropertyChanged)this.ViewData).PropertyChanged += (sender2, e2) =>
        {
            if (e2.PropertyName == "Test")
            {
                bind.ReadValue();
            }
        };
    

    最后,所有这些变通方法都可以封装到一个很好的辅助方法中,以隐藏细节并尽可能地使其可重用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      相关资源
      最近更新 更多