【问题标题】:How to manage data bindings in a 100% custom grid control如何在 100% 自定义网格控件中管理数据绑定
【发布时间】:2013-03-11 03:14:14
【问题描述】:

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

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

public interface IDiagramDataSource
{
    IBindingList Columns { get; }
}

然后让每一列实现这个:

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

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

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

【问题讨论】:

  • a lot like a grid view except this will have some custom features. - 请问这些自定义功能是什么?
  • 它实际上就像一个流程图。每个单元格都有一个箭头,指向右侧最近的非空单元格(因此它可能会在其他列的顶部展开)。您将能够上下移动单元格(而不是整行)。可能还有其他我不知道的事情。
  • "it will actually be" 听起来您还没有深入了解这一点。只是一个建议..您是否为此考虑过WPF?在 WPF 中做这样一个高级的事情(从 UI 的角度)可能会容易得多。

标签: c# winforms data-binding


【解决方案1】:

我建议2个选项:

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

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

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

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

【讨论】:

  • 除此之外,值得一提的是,WPF中不需要“自定义绘图”。不必像在 Winforms 中那样在 C# 中编写所有东西。 WPF 支持 ControlTemplatesDataTemplates 的概念,它们是在 XAML 中定义的(比 winforms 的所有者绘制更容易和更具可扩展性),而且 WPF 使用保留图形,所以你不需要做任何“部分重新” draw”,每当任何 UI 元素中的相关属性发生变化时,框架都会自行处理重新布局和重新渲染。请参阅 MSDN 中的 DependencyProperty 和 AffectsRender。
猜你喜欢
  • 2011-11-08
  • 1970-01-01
  • 2015-08-23
  • 2010-10-11
  • 2011-03-27
  • 2013-09-26
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多