2017-04-05 64 views
0

我有一个需要创建UWP DataGridNumericalColumn允许RadNumericBox属性(ValueFormatButtonsVisibilitySmallChangeLargeChangeValue)定制的定制版本以及编辑的价值的能力作为美分(199)在编辑时没有小数点位置,但在未编辑时显示为带十进制美分(1.99)的普通美元。我尝试了两种不同的方法来扩展现有控件,这两种方法我都无法完全为我工作。需要延长DataGridNumericalColumn为Telerik的UWP

1)尝试从DataGridNumericalColumn获得 - 由于无法访问内部成员,因此无法访问,即使使用GitHub提供的完整源代码。

2)尝试派生自DataGridTemplateColumn - 初始显示有点可行,但与单行编辑模式相比,显示模式和验证消息显示在单元格上的所有内容似乎都超出了范围(无法覆盖),我似乎无法使用CellContentTemplateSelector在内联编辑模式RadNumericBox显示和正常TextBlock显示之间进行选择,因为我无法检测何时将编辑模式应用于单元。

它似乎是我能够实现我所需要的唯一方法就是分叉GitHub代码库,这样我就可以从DataGridNumericalColumn派生出对内部代码的访问。

我可以采取什么方法来实现我想要的定制?

(我使用Telerik的UI对于通用的Windows平台,版本2017.1.301.45,在写这篇文章的时候。)

回答

0

我终于摸索出解决办法,让我拿过去的主要困难在使用扩展这个功能衍生自DataGridTemplateColumn的方法。以下是我所做的更新和自定义 - 它们大多在概念层面进行描述,但对于其他人员来说自己复制这种自定义应该足够了。

UPDATE1: ,因为我一直对这个更新: 从DataGridTemplateColumn推导的方法一起继续,我发现我可以成功地创建自定义改变我的标记显示为编辑模式VS显示模式在网格(CustomBeginEditCommandCustomCancelEditCommand,并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中的验证代码,似乎有一个EditRowHostPanelValidationControl与编辑器内容一起涉及,但我无法像访问那样完全实现容器。

我能做些什么来使验证信息出现在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.csExecute方法,它执行它的基本实现,其次是

Owner.editService.CancelEdit(context.TriggerAction) 

,这一点我不明白(RadDataGrid不包含定义editService,我可以” t来自CancelEditCommand类,因为它是内部的)。

我能做些什么来取消编辑(在编辑模式下点击蓝色的X),我的自定义列的值实际上会恢复到进入编辑模式之前的值?

UPDATE3: 我终于管理了一个EXTENSIVE解决方法,可以在取消时恢复我的自定义列的值。

我对涉及取消功能的解决方法: 1)创建了CustomRadDataGrid,其源自RadDataGrid

2)给我CustomRadDataGridCustomEditingService属性,这是一个CustomEditingService,其从EditingService(复制和修改代码大多注释出不需要的部分,但也改变InitializeEditOperation的实施和改变CancelEdit以具有一个输出参数该操作的OriginalValues字典),并且其源自CustomServiceBase<RadDataGrid>,其来自ServiceBase(更改IsOperational以返回Owner.DataContext != null)的复制和修改代码,其源自CustomAttachableObject<T> where T : RadControl,其是从AttachableObject复制的代码。

3)增加GetActualValueForInstance功能和SetActualValueForInstance方法来我的自定义列,它使用反射来获取/此列(根据使用我的PropertyName依赖项属性的值)中设定的数据行实例的价值,并提出我的CustomEditingServiceInitializeEditOperation只保存我的自定义列的原始值,并使我的CustomEditingServiceCancelEdit将原始值的字典返回到out变量中。

4)发调用Owner.CommandService.ExecuteDefaultCommand(CommandId.BeginEdit, context)后,我的电话CustomBeginEditCommandBeginEdit网格的CustomEditingService - 它允许将存储在我的自定义列的原始值。

五日)呼吁Owner.CommandService.ExecuteDefaultCommand(CommandId.CommitEdit, context)后,我的电话CustomCommitEditCommandCommitEdit网格的CustomEditingService - 允许我的自定义编辑服务,以正确地跟踪它的编辑状态。

6)发对电网的CustomEditingServiceCustomCancelEditCommand呼吁CancelEdit并为每个原始值的字典项,请使用Key(列,作为我的自定义列)SetActualValueForInstance传递context.CellInfo.ItemValue(以前存储的原始值),前调用Owner.CommandService.ExecuteDefaultCommand(CommandId.CancelEdit, context) - 在发生标准取消操作之前恢复我的自定义列原始值。

完成!呃......看起来这个库需要很多改变才能实现更好的扩展能力。这已经作为一个功能请求记录在Telerik根据与他们在这个问题上对我的支持票的回复。

我想其他人会希望能够扩展Telerik的各种控制,所以我在这里分享了我的努力和(最终)成功的定制。