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

时间:2010-01-04 20:55:54

标签: c# winforms data-binding

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

就我而言,我想将变量绑定到自定义ToolStripButton的属性。

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

编辑:使用winforms

6 个答案:

答案 0 :(得分:8)

您可以使用Truss来完成此操作。

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

答案 1 :(得分:5)

我在ToolStripButton上使用IBindableComponent的实现,找到了hereBindableToolStripButton允许您像使用普通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

}

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

bindableToolStripButton1.DataBindings.Add("Enabled", myClass1, "MyBooleanProperty");

答案 2 :(得分:1)

使用依赖项属性(您的ToolStripButton中的属性应该是)并在您的其他类中为您的变量创建一个属性并创建一个绑定并将其设置为您的ToolstripButton的属性。

我想这是最简单的方法。

编辑:那只适用于WPF ...

否则实现INotifyPropertyChanged,当变量发生变化时,它应该在ToolStripButton中自动更改。

答案 3 :(得分:1)

对于像绑定到对象属性的类似行为,对于任何类型,您都可以实现相同的接口。

基于这种想法,您可以将ToolStripButton(或所需类型具有绑定)子类化,并为其实现IBindableComponent。这适用于所有类型的源和目标类型,只要它们不是sealed。例如,您的工具条按钮:

public class BindableToolStripButton : ToolStripButton,  IBindableComponent {
    //...

这将导致BindableToolStripButton拥有自己的.DataBindings属性,而基础ToolStripButton类没有这样的属性。

您需要使用Microsoft在ISiteIBindableComponentIComponent以及任何继承的接口中看到的示例来完成实施细节的填写。

然后你可以将Binding instances添加到BindableToolStripButton的任何实例。

(注意:我只有fragements所以这将是我的第一个社区wiki帖子 - 我们会看到这是怎么回事......)

答案 4 :(得分:0)

我通过反射写了一些基本的数据绑定内容。它适用于任何对象,不需要实现特殊的东西(没有INotifyPropertyChanged,它只是工作)它是我的编辑器http://github.com/filipkunc/opengl-editor-cocoa的一部分看看HotChocolate / Bindings(比如重新实现Cocoa KVC,KVO到.NET)文件夹。你可以在HotChocolateTest项目中看到它。

答案 5 :(得分:0)

还有另一个快速而简单的解决方案,它包括在表单中创建属性,并绑定它们:

Tools >> User Setting >> Edit & Advanced functions.

假设MyModel包含一个DeleteAllowed属性,通知其更改。