0

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

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

public interface IDiagramDataSource
{
    IBindingList Columns { get; }
}

然后让每一列实现这个:

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

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

当您希望控件可绑定到嵌套列表时,是否有任何模式可以遵循?我猜有因为DataGridView控制这样做。

4

1 回答 1

0

我建议2个选项:

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

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

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

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

于 2013-03-11T05:18:49.457 回答