【发布时间】:2013-07-15 20:46:30
【问题描述】:
使用 VS 2010 我计划制作几个 datagrid 模板列,但它们都将包含一个文本块,我希望它们在排序、过滤、编辑等方面表现得像一个文本列。(例如,一个列它在堆栈面板中有一个文本块和一个图像,但在行为方面它应该是关于文本的。)
在使用模板列时,我了解到与普通文本单元格相关的大部分功能必须重做。例如,为了使文本可编辑,必须提供一个单元格编辑模板,如:
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox
FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"
Text="{Binding Path=SomeProperty, Mode=TwoWay, UpdateSourceTrigger=LostFocus}">
</TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
(并且你还必须处理网格事件以确保它的行为像一个普通的文本框,比如如果用户按下一个键,或者单元格的标签等自动开始编辑模式.)
所以我的问题是,什么是最好的方法(如果有的话)我可以避免显式编写此代码(以及用于排序、复制、过滤的代码,等像文本单元一样,对于我这样创建的每个模板列?我假设为每列复制半页的代码是不好的做法,唯一的区别可能是绑定的属性名称和少数视觉变化。
我对此感到非常沮丧,总体上对 WPF 也是如此。我搜索了网络,尝试了装饰器,尝试了继承数据网格列,尝试为数据模板定义用户控件,但一切似乎都因一些讨厌的“陷阱”而失败。这是关于我提出的第三个问题,其中有不同的细节,但反应很少。 不应该很难弄清楚如何实现基本上是美化的文本列,而无需每次都在每个方面都重新发明整个轮子。至少在我看来。
【问题讨论】:
-
你把事情复杂化了太多。为什么不直接为相关列设置
CellStyle,然后覆盖DataGridCell.Template?您还可以将这些模板定义为资源并重用它们。这样一来,您就可以保留DataGridTextColumn而不必自己实现它。 -
听起来不错——你能给我一些代码吗?例如,您能告诉我如何使用单元格样式来修改现有的
DataGridTextColumn,使其旁边显示文本和图像吗?
标签: wpf datagrid datagridtemplatecolumn