我在WPF 4.0中创建一个自定义控件,看起来像下图 . 它基本上由“泳道”组成 . 每个ItemsControl都有可以拖放的元素,以及项目的可视呈现,在除行 Headers 之外的每个元素的同一行内 . 有固定数量的列和可变数量的行 .
我在考虑解决这个问题的两种不同方法:
-
使用DataGrid并对其进行大量修改,以便它支持此行为 .
-
创建具有动态行数的网格,并将每个项目实现为5个控件的组(每列一个) .
注意事项:使用MVVM,整个事情应该能够绑定到列表 .
在这种情况下,最合理的方法是什么?
如果有什么不清楚请评论!
2 回答
所以听起来你应该构建几个“控件”,这将使这个更大的复合控件更容易管理 .
您拥有的大部分复杂行为是强制拖放给定行中的项控件(实际上复杂的部分是限制其他行中项控件的丢弃)
首先,我将构建一个ItemsControlGroup控件 . 类似于一个无线电组的东西,其中每个控件都是类似组的一部分 . 您可以使用组名称的附加属性来执行此操作 . 这将为您提供一种方法来确定目标是否是被拖动的给定项目的有效放置位置 .
Build 所有这一切应该与 Build 你所追求的“游泳道”布局截然不同 .
一旦你让物品控制拖放工作,你就可以用几种不同的方式构建布局 .
Zebi指出,在这一点上,DataGrid实际上可能不太难以使用 .
您还可以使用一组嵌套的堆栈面板或某种网格布局 . 布局将是简单的部分 .
如果你想使用wpf数据网格,如果你的列2-5使用了
TemplateColumn
,那么就不难实现你想要的布局:网格的项目源可以是简单的List / ObservableCollection .
但是,您仍然需要自己实现拖放机制 .