我終於摸索出解決辦法,讓我拿過去的主要困難在使用擴展這個功能衍生自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的各種控制,所以我在這裏分享了我的努力和(最終)成功的定製。