双向绑定C#。文本框和自制类的对象

时间:2015-11-20 11:56:00

标签: c# .net winforms data-binding

在MSDN文档中,我发现了一些文章,它们说将两个对象相互绑定不会有任何问题。所以我尝试使用WindowsForms应用程序。第一个对象是$ -> $(document).on 'click','.clickable', (event) -> target = $(event.target) if target.is(':not(a)') if $(this).attr('data-link') $.ajax({ dataType: 'script', url: $(this).data('link') }) else ... ,第二个对象是以下类的实例:

TextBox

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ComponentModel; namespace WindowsFormsApplication1 { public class XmlEmulator : INotifyPropertyChanged { private string Captionfield; public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged() { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("")); } public string Caption { get { return this.Captionfield; } set { this.Captionfield = value; NotifyPropertyChanged(); } } } } 绑定到TextBox可以正常工作,但如何将XmlEmulator.Captionfield oroperty绑定到Captionfield属性? TextBox.text类是否必须从XmlEmulator继承才能获得System.Windows.Forms.Control属性?在这种情况下,我遇到了麻烦,因为我已经实现了Databindings接口。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

  

在MSDN文档中,我发现了一些文章,说两个对象彼此绑定不会有任何问题。

这不正确,一个对象必须是Control,而另一个可以是任何对象(包括Control)。当您绑定到控件属性时,您可以指定绑定是否是"单向"或者"双向",以及何时通过Binding.DataSourceUpdateMode PropertyBinding.ControlUpdateMode Property更新一方或另一方。我想你的绑定已经是"双向"如果您使用过像这样的标准代码

XmlEmulator emulator = ...;
TextBox textBox = ....;
textBox.DataBindings.Add("Text", emulator, "Caption");

如果修改文本框,则模拟器属性将更新。请注意,DataSourceUpdateMode属性的默认值为OnValidation,因此在您离开文本框后将更新模拟器。如果您希望在键入时立即发生,那么您需要通过修改上述代码来设置OnPropertyChanged

textBox.DataBindings.Add("Text", emulator, "Caption", true, DataSourceUpdateMode.OnPropertyChanged);

实际上Add方法返回一个Binding对象,所以你可以使用这样的东西

var binding = textBox.DataBindings.Add("Text", emulator, "Caption");

并探索/修改绑定属性。