2017-04-05 59 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的各種控制,所以我在這裏分享了我的努力和(最終)成功的定製。