C# 需要为Telerik UWP扩展DataGridNumericalColumn

C# 需要为Telerik UWP扩展DataGridNumericalColumn,c#,telerik,uwp,telerik-grid,C#,Telerik,Uwp,Telerik Grid,我需要创建一个自定义版本的UWPDataGridNumericalColumn,允许自定义RadNumericBox属性(ValueFormat,ButtonsVisibility,SmallChange,LargeChange,Value)以及以美分编辑值的能力(199)编辑时不带小数点,但在不编辑时显示为带小数点的正常美元(1.99)。我尝试了两种不同的方法来扩展现有的控件,但这两种方法似乎都不能完全为我工作 1) 尝试从DataGridNumericalColumn派生-由于无法访问内部成

我需要创建一个自定义版本的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。)

我最终找到了解决办法,让我克服了使用衍生自
DataGridTemplateColumn
方法扩展此功能的主要困难。以下是我所做的更新和定制——它们主要是在概念层面上描述的,但是其他人应该能够为自己复制这种定制

更新1: 我一直致力于此的更新: 继续使用从
DataGridTemplateColumn
派生的方法,我发现通过在网格中创建用于编辑操作的自定义命令,我可以成功地将显示的标记更改为编辑模式与显示模式(
CustomBeginEditCommand
CustomCancelEditCommand
customcommitteeditcommand
与中的命令非常相似)与应用于网格数据的ViewModel项的接口
IItemAwareOfEditMode
,该接口具有一个bool属性
IsInEditMode
,我在自定义命令中将其设置为
true
false
,然后在自定义
数据模板选择器中使用该属性来决定何时应用y我的编辑标记与我的显示标记。这使用
(DataTemplate)XamlReader.LoadWithInitialTemplateValidation(editControlMarkup)
用于将动态创建的标记字符串转换为
DataTemplate
s。对于我的实现,我在
PropertyChangedCallback
中为自定义列的
PropertyNameProperty
依赖项属性创建标记

但是,在验证和显示验证消息以及在用户取消编辑时还原值方面,我仍然存在问题。我实现了网格行项目的ViewModel,以便它们派生自
ValidateViewModelBase
,因此它们根据ValidateIO上的文档适当地添加/删除错误n如果我使用
DataGridNumericalColumn
(非定制)对于相同的数据,当数据无效时,验证消息确实会指向单元格,但对于我的自定义列,
HasErrors
在项上为true,但验证消息不会出现。查看
CreateEditorContainer
函数中的验证代码,似乎有一个
EditRowHostPanel
ValidationControl
与编辑器内容一起涉及,但我无法访问实现容器所需的各个部分

如何使验证消息像在
DataGridNumericalColumn
中一样显示

此外,如何使取消编辑(在编辑模式下单击该行的蓝色X)实际上将自定义列的值恢复为进入编辑模式之前的值

更新2: 我一直在做的另一个更新是: 继续使用从
DataGridTemplateColumn
派生的方法,我成功地通过在编辑模式模板标记中包含
ValidationControl
来显示编辑模式的验证消息,该标记引用模板(按名称)中的
RadNumericBox
使用
ControlPeer
属性,并为其
DataItem
属性指定一个值
“{Binding}”
,并适当填充其
PropertyName

这已经接近我需要的了,但是我的
CustomCancelEditCommand
,它使用

Owner.CommandService.ExecuteDefaultCommand(CommandId.CancelEdit, context);
,不会将单元格的显示适当地更新为其以前的值。取消内联行编辑时,它不会正确地调用
customcommitteditcommand
;但是,它显示为修改后的值(不会还原为编辑前的值)。即使再次编辑,该值在网格中显示时仍保持为修改后的值

我在
Execute
方法中看到,它执行其基本实现,然后执行

Owner.editService.CancelEdit(context.TriggerAction)
,我不理解(
RadDataGrid
不包含
editService
的定义,我无法从
CancelEditCommand
类派生,因为它是内部的)

如何取消编辑(单击b键)