我需要创建自定义版本的UWP DataGridNumericalColumn
,以便自定义RadNumericBox
属性(ValueFormat
,ButtonsVisibility
,SmallChange
, LargeChange
,Value
)以及在编辑时将值编辑为美分(199)而无小数位的能力,但在不编辑时显示为带有小数点数(1.99)的普通美元。我已经尝试了两种不同的方法来扩展现有的控件,我似乎无法完全为我工作。
1)尝试从DataGridNumericalColumn
派生 - 由于无法访问内部成员,即使GitHub的完整源代码可用,也是不可能的。
2)尝试从DataGridTemplateColumn
派生 - 有点可用于初始显示,但是与内联编辑模式相关的所有内容与显示模式和验证消息显示在单元格上似乎无法触及(不能覆盖)我可以'似乎使用CellContentTemplateSelector
在内联编辑模式RadNumericBox
显示和普通TextBlock
显示之间进行选择,因为我似乎无法检测何时将编辑模式应用于单元格。
我开始似乎只能实现我需要的唯一方法是分叉GitHub代码库,这样我就可以从DataGridNumericalColumn
派生出来,可以访问内部代码。
我可以采取什么方法来实现我想要的自定义?
(在撰写本文时,我正在使用Telerik UI For Universal Windows Platform,版本2017.1.301.45。)
答案 0 :(得分:1)
我最终找到了解决方法,让我通过使用DataGridTemplateColumn
方法的派生来解决扩展此功能的主要困难。以下是我所做的更新和自定义 - 它们主要在概念层面进行描述,但是其他人应该为自己复制这种自定义。
<强> UPDATE1:强>
我正在努力解决此问题的更新:
继续从DataGridTemplateColumn
派生的方法,我发现通过创建用于编辑网格中的操作的自定义命令,我可以成功地更改显示的编辑模式与显示模式的标记(CustomBeginEditCommand
,{{1 }}和CustomCancelEditCommand
非常类似于http://docs.telerik.com/devtools/universal-windows-platform/controls/raddatagrid/features/commands/editing-commands/datagrid-editingcommands-begineditcommand中的那些)以及一个接口CustomCommitEditCommand
,应用于Grid的数据的ViewModel项目,只有一个bool我在自定义命令中正确设置为IItemAwareOfEditMode
或IsInEditMode
的属性true
,然后在自定义false
中使用该属性决定何时应用我的编辑标记与我的显示标记。这使用DataTemplateSelector
将动态创建的标记字符串转换为(DataTemplate)XamlReader.LoadWithInitialTemplateValidation(editControlMarkup)
。对于我的实现,我在DataTemplate
中为我的自定义列PropertyChangedCallback
依赖项属性创建了标记。
但是,我仍然遇到验证和显示验证消息的问题,并在用户取消编辑时还原值。我为实现的网格行项目提供了ViewModel,使得它们派生自PropertyNameProperty
,因此他们根据http://docs.telerik.com/devtools/universal-windows-platform/controls/raddatagrid/features/validation上的验证文档适当地添加/删除错误。如果我使用具有相同数据的ValidateViewModelBase
(非自定义),则当数据无效时,验证消息会显示为指向单元格,但是对于我的自定义列,项目上的DataGridNumericalColumn
为真,但验证信息不会出现。查看HasErrors
函数中https://github.com/telerik/UI-For-UWP/blob/master/Controls/Grid/Grid.UWP/View/Columns/TypedColumns/DataGridTypedColumn.cs中的验证码,似乎有CreateEditorContainer
和EditRowHostPanel
与编辑器内容一起使用,但我不知道完全可以像在那里那样访问实现容器所需的部件。
我可以做些什么来使验证消息像ValidationControl
中那样显示?
此外,如何取消编辑(在编辑模式下单击行的蓝色X)实际上将我的自定义列的值恢复为进入编辑模式之前的值?
<强> UPDATE2:强>
另一个更新,因为我一直在努力:
继续从DataGridNumericalColumn
派生的方法,我通过在编辑模式模板标记中包含DataGridTemplateColumn
来设法成功显示编辑模式的验证消息,该标记引用{{1使用ValidationControl
属性从模板(按名称),并为其RadNumericBox
属性赋值ControlPeer
,并适当填充其DataItem
。
这已接近我的需要,但似乎是我的"{Binding}"
,它使用
PropertyName
,没有适当地将单元格的显示更新为其先前的值。当内联行编辑被取消时,它正确地不会调用CustomCancelEditCommand
;但是,它显示为修改后的值(未恢复为编辑前的值)。即使再次编辑,该值仍将作为修改后的值显示在网格中。
我在Owner.CommandService.ExecuteDefaultCommand(CommandId.CancelEdit, context);
方法的https://github.com/telerik/UI-For-UWP/blob/master/Controls/Grid/Grid.UWP/View/Services/Commands/Editing/CancelEditCommand.cs中看到它执行其基本实现,然后是
CustomCommitEditCommand
,我不明白(Execute
不包含Owner.editService.CancelEdit(context.TriggerAction)
的定义,而我无法从RadDataGrid
类派生,因为它是内部的)
如何取消编辑(在编辑模式下单击行的蓝色X)实际上将我的自定义列的值恢复为进入编辑模式之前的值?
<强> UPDATE3:强> 我终于设法了一个可以恢复自定义列的EXTENSIVE解决方法&#39;取消的价值。
我对取消功能的解决方法包括:
1)创建了一个editService
,它派生自CancelEditCommand
。
2)给我的CustomRadDataGrid
类一个RadDataGrid
属性CustomRadDataGrid
,这是CustomEditingService
的复制和修改代码(主要是注释掉不需要的部分,但是还要更改CustomEditingService
的实施并将EditingService
更改为具有操作InitializeEditOperation
词典的out参数),并从CancelEdit
派生,这是从OriginalValues
复制和修改的代码(已更改CustomServiceBase<RadDataGrid>
到返回ServiceBase
),该代码派生自IsOperational
,这是从Owner.DataContext != null
复制的代码。
3)在我的自定义列中添加了CustomAttachableObject<T> where T : RadControl
函数和AttachableObject
方法,该列使用反射来获取/设置此列的数据行实例的值(基于使用我的{{ 1}}依赖属性的值),并使我GetActualValueForInstance
的{{1}}只保存自定义列的原始值,并生成SetActualValueForInstance
PropertyName
在out变量中返回原始值的字典。
4)在调用InitializeEditOperation
后,在网格CustomEditingService
上发出CancelEdit
来电CustomEditingService
,这样就可以存储我的自定义列原始值。< / p>
5)在致电CustomBeginEditCommand
后,在网格BeginEdit
上发出CustomEditingService
来电Owner.CommandService.ExecuteDefaultCommand(CommandId.BeginEdit, context)
,这样我的自定义编辑服务就可以正确跟踪其编辑状态
6)在网格CustomCommitEditCommand
和我的每个原始值词典项目上发出CommitEdit
来电CustomEditingService
,使用Owner.CommandService.ExecuteDefaultCommand(CommandId.CommitEdit, context)
(列,作为我的自定义列)CustomCancelEditCommand
传入CancelEdit
和CustomEditingService
(之前存储的原始值),在调用Key
之前 - 在标准取消操作之前恢复我的自定义列原始值发生。
完成!哇......似乎这个库需要进行大量更改才能获得更好的扩展能力。这已作为Telerik的功能请求记录,根据我对该主题的支持请求回复。
我认为其他人也希望能够扩展Telerik的各种SetActualValueForInstance
控件,所以我在这里分享了我的努力和(最终)成功的定制。