C#如何在没有Control的情况下实现数据绑定?

pet*_*r p 7 c# data-binding winforms

当两个类都不是Control类型时,有没有一种简单的方法来实现数据绑定?

在我的例子中,我想将变量绑定到自定义ToolStripButton的属性.

编辑澄清:当绑定到Control时,我可以使用Control的DataBindings集合.但是,我正在寻找一种绑定属性的方法,无论源和目标类型如何.

编辑:使用winforms

Ree*_*sey 8

你可以通过使用Truss来做到这一点.

Truss为实现INotifyPropertyChanged的任何类提供WPF样式的数据绑定.它为您提供了更多的灵活性,因为它不会将类限制为从特定的基类派生.


ric*_*chn 5

IBindableComponent在ToolStripButton上使用了这个Implemetation,在这里找到.将BindableToolStripButton允许您使用数据绑定像一个正常的Control.

[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip | ToolStripItemDesignerAvailability.StatusStrip)]
public class BindableToolStripButton : ToolStripButton, IBindableComponent
{

    public BindableToolStripButton()
        : base() { }
    public BindableToolStripButton(String text)
        : base(text) { }
    public BindableToolStripButton(System.Drawing.Image image)
        : base(image) { }
    public BindableToolStripButton(String text, System.Drawing.Image image)
        : base(text, image) { }
    public BindableToolStripButton(String text, System.Drawing.Image image, EventHandler onClick)
        : base(text, image, onClick) { }
    public BindableToolStripButton(String text, System.Drawing.Image image, EventHandler onClick, String name)
        : base(text, image, onClick, name) { }



    #region IBindableComponent Members
    private BindingContext bindingContext;
    private ControlBindingsCollection dataBindings;

    [Browsable(false)]
    public BindingContext BindingContext
    {
        get
        {
            if (bindingContext == null)
            {
                bindingContext = new BindingContext();
            }
            return bindingContext;
        }
        set
        {
            bindingContext = value;
        }
    }
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public ControlBindingsCollection DataBindings
    {
        get
        {
            if (dataBindings == null)
            {
                dataBindings = new ControlBindingsCollection(this);
            }
            return dataBindings;
        }
    }
    #endregion

}
Run Code Online (Sandbox Code Playgroud)

假设您有一个类MyClass实现INotifyPropertyChanged,就像绑定到控件属性时一样使用它:

bindableToolStripButton1.DataBindings.Add("Enabled", myClass1, "MyBooleanProperty");
Run Code Online (Sandbox Code Playgroud)