如何为控件的嵌套属性创建数据绑定?

本文关键字:属性 创建 数据绑定 嵌套 控件 | 更新日期: 2023-09-27 18:08:48

考虑以下内容:

public interface IHaveProperties
{
    public MyProperties Properties { get; set; }
}
public class MyControlA : SomeWinFormsControl, IHaveProperties { ... }
public class MyControlB : SomeOtherWinFormsControl, IHaveProperties { ... }
public class MyProperties
{
    public int Foo { get; set; }
    public string Bar { get; set; }
    public double Baz { get; set; }
    ...
}

这允许我们添加相同的附加属性到许多不同的控件,这些控件的基类我们不能修改,以及保存/加载属性集。

现在我们有十几个不同的MyControlX,我们已经意识到能够数据绑定到,比如说,Properties.Bar,这将是很好的。

显然我们可以这样做:

public interface IHaveProperties
{
    public MyProperties Properties { get; set; }
    public string Bar { get; set; }
}
public class MyControlA : SomeWinFormsControl, IHaveProperties
{
    public string Bar
    {
        get { return Properties.Bar; }
        set { Properties.Bar = value; }
    }
}

…但是我们必须把同样的代码放到十几个控件中,这看起来有点臭。

我们试过了:

// Example: bind control's property to nested datasource property
myTextBox.DataBindings.Add(new Binding("Text", myDataSet, "myDataTable.someColumn"))
// works!
// bind control's (nested) Properties.Bar to datasource
myTextBox.DataBindings.Add(new Binding("Properties.Bar", someObject, "AProperty"))
// throws ArgumentException!

是否有某种方式通过构建绑定或修改MyProperties类来绑定到myControl.Properties.Bar,而不是对所有控件进行相同的更改?

如何为控件的嵌套属性创建数据绑定?

不应该是这样吗:

TextBox.DataBindings.Add(new Binding("Text", someObject, "Properties.Bar"));