我终于摸索出解决办法,让我拿过去的主要困难在使用扩展这个功能衍生自DataGridTemplateColumn
的方法。以下是我所做的更新和自定义 - 它们大多在概念层面进行描述,但对于其他人员来说自己复制这种自定义应该足够了。
UPDATE1: ,因为我一直对这个更新: 从DataGridTemplateColumn
推导的方法一起继续,我发现我可以成功地创建自定义改变我的标记显示为编辑模式VS显示模式在网格(CustomBeginEditCommand
,CustomCancelEditCommand
,并CustomCommitEditCommand
非常类似http://docs.telerik.com/devtools/universal-windows-platform/controls/raddatagrid/features/commands/editing-commands/datagrid-editingcommands-begineditcommand的那些)与接口IItemAwareOfEditMode
,应用到视图模型项目面向网格的数据一起,有一个布尔属性IsInEditMode
我设置为true
编辑操作的命令或false
适当地在自定义命令中,然后在自定义012中使用决定何时应用我的编辑标记与我的显示标记。这使用(DataTemplate)XamlReader.LoadWithInitialTemplateValidation(editControlMarkup)
将动态创建的标记字符串翻译为DataTemplate
s。对于我的实现,我在PropertyChangedCallback
中为我的自定义列的PropertyNameProperty
依赖项属性创建了标记。
但是,我仍然遇到验证和显示验证消息的问题,并在用户取消编辑时恢复值。我已将ViewModel用于网格行项目,因此它们源自ValidateViewModelBase
,因此它们根据验证文档http://docs.telerik.com/devtools/universal-windows-platform/controls/raddatagrid/features/validation正确添加/删除错误。如果我使用DataGridNumericalColumn
(未定制)和相同的数据,则验证消息在数据无效时出现在单元格中,但使用我的自定义列时,HasErrors
对于项目是正确的,但验证消息未出现。查看函数https://github.com/telerik/UI-For-UWP/blob/master/Controls/Grid/Grid.UWP/View/Columns/TypedColumns/DataGridTypedColumn.cs中的验证代码,似乎有一个EditRowHostPanel
和ValidationControl
与编辑器内容一起涉及,但我无法像访问那样完全实现容器。
我能做些什么来使验证信息出现在DataGridNumericalColumn
中?
另外,我能做些什么来取消编辑(在编辑模式下点击蓝色的X),我的自定义列的值实际上会恢复到进入编辑模式之前的值?
UPDATE2: 另一个更新,因为我一直对这样的: 从DataGridTemplateColumn
推导的方法一起继续,我已经成功地通过在一个ValidationControl
成功地显示在编辑模式验证消息编辑模式模板标记,它使用ControlPeer
属性从模板(按名称)引用RadNumericBox
,并为其DataItem
属性赋值"{Binding}"
,并适当填充其PropertyName
。
这是越来越接近我所需要的,但似乎我的CustomCancelEditCommand
,它采用
Owner.CommandService.ExecuteDefaultCommand(CommandId.CancelEdit, context);
,不恰当地更新单元格的先前值显示。当内联行编辑被取消时,它不会正确调用CustomCommitEditCommand
;但是,它显示为修改后的值(未恢复为编辑前的值)。即使再次编辑,该值在网格中显示时仍为修改后的值。
我看到,在https://github.com/telerik/UI-For-UWP/blob/master/Controls/Grid/Grid.UWP/View/Services/Commands/Editing/CancelEditCommand.cs在Execute
方法,它执行它的基本实现,其次是
Owner.editService.CancelEdit(context.TriggerAction)
,这一点我不明白(RadDataGrid
不包含定义editService
,我可以” t来自CancelEditCommand
类,因为它是内部的)。
我能做些什么来取消编辑(在编辑模式下点击蓝色的X),我的自定义列的值实际上会恢复到进入编辑模式之前的值?
UPDATE3: 我终于管理了一个EXTENSIVE解决方法,可以在取消时恢复我的自定义列的值。
我对涉及取消功能的解决方法: 1)创建了CustomRadDataGrid
,其源自RadDataGrid
。
2)给我CustomRadDataGrid
类CustomEditingService
属性,这是一个CustomEditingService
,其从EditingService
(复制和修改代码大多注释出不需要的部分,但也改变InitializeEditOperation
的实施和改变CancelEdit
以具有一个输出参数该操作的OriginalValues
字典),并且其源自CustomServiceBase<RadDataGrid>
,其来自ServiceBase
(更改IsOperational
以返回Owner.DataContext != null
)的复制和修改代码,其源自CustomAttachableObject<T> where T : RadControl
,其是从AttachableObject
复制的代码。
3)增加GetActualValueForInstance
功能和SetActualValueForInstance
方法来我的自定义列,它使用反射来获取/此列(根据使用我的PropertyName
依赖项属性的值)中设定的数据行实例的价值,并提出我的CustomEditingService
的InitializeEditOperation
只保存我的自定义列的原始值,并使我的CustomEditingService
的CancelEdit
将原始值的字典返回到out变量中。
4)发调用Owner.CommandService.ExecuteDefaultCommand(CommandId.BeginEdit, context)
后,我的电话CustomBeginEditCommand
上BeginEdit
网格的CustomEditingService
- 它允许将存储在我的自定义列的原始值。
五日)呼吁Owner.CommandService.ExecuteDefaultCommand(CommandId.CommitEdit, context)
后,我的电话CustomCommitEditCommand
上CommitEdit
网格的CustomEditingService
- 允许我的自定义编辑服务,以正确地跟踪它的编辑状态。
6)发对电网的CustomEditingService
我CustomCancelEditCommand
呼吁CancelEdit
并为每个原始值的字典项,请使用Key
(列,作为我的自定义列)SetActualValueForInstance
传递context.CellInfo.Item
和Value
(以前存储的原始值),前调用Owner.CommandService.ExecuteDefaultCommand(CommandId.CancelEdit, context)
- 在发生标准取消操作之前恢复我的自定义列原始值。
完成!呃......看起来这个库需要很多改变才能实现更好的扩展能力。这已经作为一个功能请求记录在Telerik根据与他们在这个问题上对我的支持票的回复。
我想其他人会希望能够扩展Telerik的各种控制,所以我在这里分享了我的努力和(最终)成功的定制。