一、前言 在日常的界面開發中,我們大多使用MVVM模式進行開發。通常情況下,一個PropertyGridControl或者DataGrid的ItemsSource設置好, 然後每一列綁定好某一條ItemsSource中的某一個欄位就可以跑起來了。 但是也有另一種情況: 假設一個界面Temp.xaml ...
一、前言
在日常的界面開發中,我們大多使用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是一個非常實用的隱藏方法。