一、前言
在日常的介面開發中,我們大多使用MVVM模式進行開發。通常情況下,一個PropertyGridControl或者DataGrid的ItemsSource設定好,
然後每一資料行繫結好某一條ItemsSource中的某一個欄位就可以跑起來了。
但是也有另一種情況:
假設一個介面Temp.xaml,它的ViewModel為TempViewModel.cs;
有一個PropertyGridControl的ItemsSource以ObservableCollection<Model>綁定;
PropertyGridControl中的一個PropertyDefinition要重寫Template,它所綁定的資訊並不只有Model中的某個欄位,
還可能包括Model中的若干個欄位,甚至TempViewModel中的一些其它資訊,這個時候該如何操作?
二、執行個體
Temp.xaml:
<services:DockablePane.Resources> <ResourceDictionary> <DataTemplate x:Key="EditTemplate"> <special:SpEdit x:Name="PART_Editor"/> //這裡是關鍵!!!!!!!!!!!!!!! </DataTemplate> </ResourceDictionary> </services:DockablePane.Resources><dxprg:PropertyGridControl Margin="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"SelectedObjects="{Binding Infos}" ShowProperties="WithPropertyDefinitions"ShowDescriptionIn="ToolTipAndPanel" ShowCategories="True" ExpandCategoriesWhenSelectedObjectChanged="True"ShowMenuButtonInRows="False" ShowToolPanel="False" ShowSearchBox="False" SortMode="Definitions"> <dxprg:PropertyGridControl.PropertyDefinitions> <!--通用--> <dxprg:PropertyDefinition IsReadOnly="True" Path="Code"/> <dxprg:PropertyDefinition IsReadOnly="True" Path="AProperty"/> <dxprg:PropertyDefinition Path="BProperty"/> <dxprg:PropertyDefinition Path="CProperty"/> <dxprg:PropertyDefinition Path="DProperty"/> <dxprg:PropertyDefinition Path="EProperty" ContentTemplate="{StaticResource EditTemplate}"/> </dxprg:PropertyGridControl.PropertyDefinitions></dxprg:PropertyGridControl>
在這裡,我們重寫的DataTemplate中的表單名稱為:PART_Editor
這個名字特別重要,不能改其它的。
這樣我們就可以在SpEdit這個表單中調用TempViewModel的全部資訊,因為這個時候TempViewModel已經賦值給了SpEdit的DataContext的某個屬性上,
可能的情況是這樣的:
SpEdit.xaml.cs:
var source = this.DataContext as RowData;if (source != null) _sourceData = (source.Definition.DataContext) as VM;
這樣,我們就把Temp.xaml的ViewModel傳給了SpEdit的_sourceData。
三、小結
本文主要描述了如何在重寫介面中擷取源UI中的ViewModel資訊。PART_Editor是一個非常實用的隱藏方法。