2013-08-22 32 views
0

我做了我的第一對C#.NET MVVM項目,我想繼續這個。所以我認爲這會很好,讓我自己的簡單 - 讓我們說 - 框架,我可以把mvvm東西,我需要在我的大部分項目。我創建了一些控件和其他有用的方法。到現在爲止還挺好。如何將MainViewModel和MainWindowView添加到自己的框架中?

現在我想包括一個「通用」MainViewModelMainWindowView,這應該給我所有我的項目到我的框架相同的表面,我不知道最好的辦法做到這一點。

MainViewModel應該是其他項目的基礎。我已經聲明瞭一個帶有我總是需要的按鈕(如顯示,編輯,保存設置)的功能區,並且我有一個方法可以將按鈕添加到我的視圖的功能區中,只需一個方法調用(AddButton(Command ,Image,Label)),一個用於打開tabcontrol的命令,一個ReloadCommand,Fields to Repositories,一個DialogService以及在ViewModel中註冊工作區的方法。

我也有一個MainWindowView在那裏我有一個RibbonMenue,StatusBar,組合框左邊的基本UI,我只想添加特定於應用程序的TabItems !?

我真的不知道什麼是在使用該框架的特殊應用程序中「指定」它的最佳方式。我只是想繼承,或用屬性反射或類似的東西。

在框架中使用MainViewModel和MainWindowView的最佳方式是什麼?

+2

目前尚不清楚在這裏你的問題是什麼:這是使用DataTemplate對象在App.xaml文件來完成。反射和屬性從哪裏來? –

+0

對不起,我編輯了這個問題。我有例如一些命令,我​​想在項目中指定它們 – Tobias

+1

那麼如果你想在框架中有一個虛擬機實現你必須考慮,爲什麼你想把它放在那裏。你的'MainViewModel'有什麼特別之處?你是否需要在其他項目中使用相同的實現? – DHN

回答

1

我不確定我們是否在同一頁面上,但我假設您的MainViewModel類就像是一個「基本視圖模型」類。我在我的MVVM項目中有一個通用的BaseViewModel類,但我也有通用的BaseDataType類以及(都)將INotifyPropertyChanged接口暴露給擴展類。在我的應用程序中,我有一系列Manager類實現Singleton模式(例如,每個模式只能有一個)。 BaseViewModel類將這些有價值的管理器類公開給擴展視圖模型類。每個經理類都提供了一些更多功能。例如,請參見下面的列表:

StateManager:保持在整個應用程序

DependencyManager全局數據/對象的狀態:保持與接口的集合,其具體實現

FeedbackManager依賴:保持訪問(用於用戶反饋)的應用反饋控制

窗口管理器:提供了文件對話框和子窗口管理

CLI訪問pboardManager:提供對計算機的訪問剪貼板

UiThreadManager:提供對多線程

EmailManager:提供訪問能夠發送電子郵件

HardDriveManager:可用於訪問用戶的計算機硬盤驅動器

ExportManager:可用於訪問XML生成和FTP傳輸

DataOperationManager:提供對所有的數據存取操作(下面進一步解釋)

UpdateManager:可用於訪問應用程序的更新

SecurityManger:提供對所有安全事項

ExcelManager:提供了對基於視圖模型數據生成Excel文檔的功能。

所有這些管理器類都可以從擴展BaseViewModel類的任何視圖模型訪問。

除此之外,我(摘要)BaseViewModel也暴露了均要求在每個視圖某些Command對象,如「保存」,刪除」,‘刷新’等

最後,它也提供了訪問經常使用的功能如'InsertNewDataTypeToCollection'和'RemoveDataTypeFromCollection'方法。

除了'框架'的這部分,我還有一些基礎數據類型類。這些提供了常用的屬性和常用的功能,如數據同步,動畫,數據錯誤報告('IDataErrorInfo'界面的擴展),它自動鏈接到反饋控制。

我的系統的最後一部分是圍繞數據庫訪問進行的。我有一套類,它包裹每個進入或去往數據庫的數據對象。這些自動在用戶界面中提供用戶反饋,異步操作以及錯誤記錄和處理。

我希望這可以幫助你,我沒有誤解你的問題。

UPDATE >>>

Oooops,我忘了說最重要的部分...我有一個MainViewModel類,它擴展BaseViewModel並顯示在MainWindow.xaml。在這個視圖模型,有BaseViewModel類型的公共屬性:

public BaseViewModel ViewModel 
{ 
    get { return viewModel; } 
    set 
    { 
     if (viewModel != value) 
     { 
      viewModel = value; 
      NotifyPropertyChanged("ViewModel"); 
     } 
    } 
} 

我可以將此屬性設置爲已擴展BaseViewModel類中的任何視圖模型類。在MainWindow.xaml,我具有以下設置:

... 
<Grid Grid.Row="1" Background="{StaticResource Windows7LightBackground}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <ContentControl Grid.RowSpan="2" Content="{Binding ViewModel}" Margin="5" /> 
</Grid> 
<Controls:FeedbackControl Grid.Row="0" Feedback="{Binding FeedbackManager.Feedback}" 
VerticalAlignment="Top" HorizontalAlignment="Stretch" MaxWidth="750" 
Margin="100,22,100,0" /> 
... 

在第一Grid行,我有一個Ribbon的控制,在第二I具有ContentControl,它顯示的是在ViewModel設置視圖模型相匹配的視圖財產,然後我有一個自定義FeedbackControl,當反饋到達時,滑入和滑出視圖。

這個難題的最後一部分是將視圖與視圖模型鏈接起來。

... 
<DataTemplate DataType="{x:Type ViewModels:HomeViewModel}"> 
    <Views:HomeView /> 
</DataTemplate> 
<DataTemplate DataType="{x:Type ViewModels:MainViewModel}"> 
    <Views:MainView /> 
</DataTemplate> 
... 
+0

是的,我們正確的方式。 :)所以你有一個叫做BaseViewModel的抽象ViewModel,你把那個管理器放進去了。你是否也知道我可以如何處理它,當我還有一個MainWindowView時,我有一個RibbonMenue,一個StatusBar和左邊的ComboBoxes只想添加特定於應用程序的TabItems?你明白我的意思嗎? :) – Tobias

+0

我已經爲你更新了我的答案。 – Sheridan

+0

好的,你用viewmodel屬性來處理它。看起來不錯:)非常感謝這個詳細的答案! – Tobias

相關問題