当前位置: 首页 > 知识库问答 >
问题:

winform控件上的双向数据绑定动态对象

壤驷彦
2023-03-14

我想将一个动态对象数据绑定到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";
        }
    }

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

为了完整起见,这篇文章给了我这个方法。

共有1个答案

杜诚
2023-03-14

简单地说,绑定无法响应数据源的属性更改,因为它不知道它需要侦听的属性的名称,因为绑定的构造函数(第三个参数)中没有提供属性名称--这是设计的。

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

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

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

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

 类似资料:
  • 1. 前言 本小节我们将介绍 Vue 中数据的双向绑定指令 v-model。v-model 的学习相对简单 我们可以用 v-model 指令在表单 、 及 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。 2. 慕课解释 用 v-model 指令在表单 、 及 元素上创建双向数据绑定。它会根据控件类型自动选

  • 出于好奇和增加知识,我想在dom元素和javascript变量之间实现某种双向数据绑定。 我很幸运,在这里@stackoverflow找到了一个很好的答案,解决了我一半的问题,这就引出了这个要点https://gist.github.com/384583,但我仍然无法100%完成这件事。 下面是我的代码示例:http://jsfiddle.net/bpH6Z/ 如果您尝试运行fiddle并单击“查

  • 如果我不使用双向数据绑定,将替换为则一切正常。那么正确的方式是什么呢?

  • 本文向大家介绍Nuxt.js 数据双向绑定的实现,包括了Nuxt.js 数据双向绑定的实现的使用技巧和注意事项,需要的朋友参考一下 假定我们有一个需求,一开始通过mounted()将一个字符串渲染在页面上,但是我们经过操作后修改了数据并且需要将得到的结果重新异步渲染到页面中去,而不是跳转刷新页面来重新渲染 首先模板中data()中定义数据,并且要将定义的数据显示出来 然后我们通过methods里的

  • 本文向大家介绍Vue实现双向数据绑定,包括了Vue实现双向数据绑定的使用技巧和注意事项,需要的朋友参考一下 Vue实现双向数据绑定的方式,具体内容如下 Vue是如何实现双向数据绑定的呢?答案是前端数据劫持。其通过Object.defineProperty()方法,这个方法可以设置getter和setter函数,在setter函数中,就可以监听到数据的变化,从而更新绑定的元素的值。 实现对象属性变化

  • Mpx针对表单组件提供了wx:model双向绑定指令,类似于v-model,该指令是一个语法糖指令,监听了组件抛出的输入事件并对绑定的数据进行更新,默认情况下会监听表单组件的input事件,并将event.detail.value中的数据更新到组件的value属性上。 简单实用示例如下: <view> <input type="text" wx:model="{{message}}"> <

  • 双向绑定这个概念在angular出现的时候,就作为王牌概念. 现在几乎是个js前端框架,就有这个功能. 它的概念是: 某个变量, 如果展现在页面上的话: 如果在代码层面进行修改, 那么页面的值就会发生变化 如果在页面进行修改(例如在input标签中), 那么代码的值就会发生变化. 一个演示例子. 在我们的项目中,增加一个 vue页面: src/components/TwoWayBinding.vu