如何在100%自定义网格控件中管理数据绑定

时间:2013-03-11 03:14:14

标签: c# winforms data-binding

我正在从头开始编写一个自定义控件(使用Graphics),它将代表一组列,每列都有一个单元格列表,很像网格视图,除了这将有一些自定义功能

我正在努力弄清楚如何管理所有数据绑定问题。我希望这个网格具有DataSource属性,该属性基本上需要是某些对象的锯齿状数组(2D),每个对象都需要绑定到控件中的单元格。我仍然不确定每个对象将具有哪些属性,到目前为止我只使用文本。我一直在努力做的是让我的模型实现这个界面:

public interface IDiagramDataSource
{
    IBindingList Columns { get; }
}

然后让每一列实现这个:

public interface IDiagramColumnDataSource : INotifyPropertyChanged
{
    IBindingList Cells { get; }
}

但是我仍然很难找到保持所有这些对象与网格中相应对象同步的最佳方法。我希望能够将所有绑定的混乱放在一个独立的课程中,但不知道如何做到这一点。现在,只要数据源发生任何变化,我就会重新整理整个事情,但我希望最终能够确定哪个单元格中的哪个属性或哪个列中的哪个单元格已更改,以便我只能更新我网格中的必要项目。

当您希望控件可绑定到嵌套列表时,是否存在任何模式?我猜是因为DataGridView控件执行此操作。

1 个答案:

答案 0 :(得分:0)

我建议2选项:

HighCore建议的第一个建议是使用WPF而不是自定义winform对象来完成这项工作。 WPF还有更多的控件(ListView,甚至是通用的ItemContainer,如果我没有记错的话)。只需在ViewModel上实现INotifyPropertyChanged,然后在每次需要刷新控件时调用OnPropertyChanged作为根(聚合)元素。不要忘记为ItemsSource Binding添加UpdateSourceTrigger。 WPF控件还具有良好的拖放功能实现。

我不会详细介绍WPF中的实现,因为有很多文章在解释它。

但是,如果您认为必须使用自定义图形绘图,那么它非常复杂。每次项目列表中发生任何更改时,您必须触发该方法重新绘制控制图形才能使其生效。如果你可以对你的图形进行部分更新(可能使用面板来欺骗它)会更好,但它会更难。

如果处理不当(此外,如果您的控件包含大量数据和/或控件大小),则可能会导致一些高内存负载。