2

动态对象我想数据绑定动态对象在winform应用程序的控制。到目前为止,我得到了它有点工作,但它似乎数据绑定“第一次”,但后来当我改变属性值不承担绑定的控制效果,这是我无法克服的问题。双向数据绑定的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"; 
     } 
    } 

为了记录在案,如果我改变控制值,它会反映在动态特性,这是OK了。

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

回答

1

简单地说,Binding无法响应你的DataSource的属性更改,因为它没有意识到它需要侦听的属性的名称,因为在设计中没有在Binding的构造函数中提供属性名称(第3个参数)。

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

如果您使用以下行例如延长你的代码结合之前被添加到DataBindings集合,是可以解决的绑定双向的。

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

最后,所有这些解决方法可以被封装到一个不错的辅助方法来隐藏细节,并使其可重复使用尽可能多的。