2011-07-14 21 views
7

我有一個相當基本的WPF UI,用戶請求會導致在我的TabControl中打開一個新選項卡。在的TabControl綁定到ObservableCollection<ViewModelBase>關於ViewModel管理的問題(DesignTime與運行時間)

我添加視圖模型實例到這個集合,以及相應的選項卡的內容是根據顯示模板是這樣的:

<DataTemplate DataType="{x:Type viewModels:UserUploadsViewModel}"> 
     <userControls:UserUploads /> 
    </DataTemplate> 

現在讓我們說UserUploads的是內部控制我倒要連線了VM在XAML來幫助設計,是這樣的:

<UserControl x:Class=".....UserUploads" 
    ..... 
    DataContext="{Binding Source={StaticResource ViewModelLocater}, 
        Path=UserAdministrationViewModel}"> 

這個屬性在運行時將返回一個VM提供現場服務,並在設計時模擬數據的VM。

問:這個XAML會干擾我將TabItems內容綁定到ViewModel實例並依靠上面的dataTemplate渲染正確的View嗎?如果是這樣,是否有辦法讓這兩個概念一起工作?

回答

22

有一個更簡單的方法來做到這一點。有DesignTimeUserAdministrationViewModel,並在構造函數中的靜態數據填充它,是指在UserControl爲:

<UserControl d:DataContext="{d:DesignInstance designTimeVMs:DesignTimeUserAdministrationViewModel, IsDesignTimeCreatable=True}"> 

這種方式你勢必d:DataContext和運行時綁定到實際DataContext實時數據設計時的測試數據。更多詳情here

+0

這看起來不錯。所以如果是設計時,那(設計時間視圖模型)對象將被連接起來,但是在運行時它什麼都不會做? –

+1

是的,它是爲了混合性而添加的。 – anivas

+0

太棒了!使用'IsDesignTimeCreatable = True'將填充數據視圖。如果設置爲「False」,它只會提供數據的「形狀」,從而在設計器中提供完整的數據綁定支持,而不是盲目地綁定。另外,您可以使用.xaml文件通過'{d:DesignData}'完整地指定示例數據。請參閱[演練:使用DesignInstance綁定到設計器中的數據](http://msdn.microsoft.com/zh-cn/library/dd490796(VS.100).aspx)和[演練:使用示例數據WPF設計器](http://msdn.microsoft.com/en-us/library/ee823176(v = vs.100).aspx) – cod3monk3y

1

是的,我認爲這將與當前設置

的ViewModelLocator是一個靜態類返回在設計時爲虛擬對象,並在運行時的靜態視圖模型干擾。這意味着,

  • 的ViewModelLocator,不是你的ParentViewModel,包含您TabViewModels

  • 你不能有相同標籤的多個實例(視圖模型)開放一次

  • 你不能管理打開/關閉選項卡,除非您引用UserControl,這違反了MVVM原則,ViewModel不知道視圖

  • 您不能實例化新副本具有參數化構造函數的TabViewModel。例如,OpenTabs.Add(new CustomerViewModel(CustomerId));

也許替代可能是一個轉換器?如果在設計時返回靜態對象,或者在運行時返回綁定對象?我從來沒有測試過這樣的東西,但理論上它應該工作:)

1

在MS的東西內置不壞,但另一個我正忙着納入我的項目更優雅,結構合理的替代方法是: http://msdn.microsoft.com/en-us/magazine/dn169081.aspx

基本上,您使用的MVVM光工具包與SimpleIoc容器它自帶和最終能夠爲以下三種情況提供數據:

設計時間,運行時間和測試時間。

更好的是,MVVM Light的要點是讓您的東西可以在Blend中直接編輯,並且有一系列視頻和博客以及示例應用程序來描述這一切。我希望我早些時候在WPF探索中發現了這些。