我不确定我们是否在同一页面上,但我假设您的MainViewModel
课程就像一个“基本视图模型”课程。我的 MVVM 项目中有一个泛型BaseViewModel
类,但我也有泛型BaseDataType
类,它们(两者)都将INotifyPropertyChanged
接口暴露给扩展类。
在我的应用程序中,我有一系列Manager
实现单例模式的类(例如,每个类只能有一个)。该类BaseViewModel
将这些有价值的管理器类公开给扩展的视图模型类。每个管理器类都提供了一些进一步的功能。例如,请参阅以下列表:
StateManager:维护整个应用程序的全局数据/对象状态
DependencyManager:使用一组接口及其具体实现来维护依赖关系
FeedbackManager:维护对应用程序反馈控制的访问(用于用户反馈)
WindowManager:提供对文件对话框和子窗口管理的访问
ClipboardManager:提供对计算机剪贴板的访问
UiThreadManager:提供对多线程的访问
EmailManager:提供能够发送电子邮件的访问权限
HardDriveManager:提供对用户计算机硬盘的访问
ExportManager:提供对 XML 生成和 FTP 传输的访问
DataOperationManager:提供对所有数据操作的访问(下面进一步解释)
UpdateManager:提供对应用程序更新的访问
SecurityManger:提供对所有安全事务的访问
ExcelManager:提供对基于视图模型数据生成 Excel 文档的功能的访问。
所有这些管理器类都可以从任何扩展BaseViewModel
该类的视图模型中访问。
除此之外,我的(摘要)BaseViewModel
还公开Command
了每个视图中需要的某些对象,例如“保存”、“删除”、“刷新”等。
最后,它还提供对“InsertNewDataTypeToCollection”和“RemoveDataTypeFromCollection”方法等常用功能的访问。
除了“框架”的这一部分,我还有许多基本数据类型类。这些提供通用属性和常用功能,如数据同步、动画、数据错误报告(“IDataErrorInfo”接口的扩展),这些功能会自动与反馈控件链接。
我系统的最后一部分围绕数据库访问展开。我有一套类,我围绕着每个进出数据库的数据对象。这些会自动在 UI、异步操作以及错误记录和处理中提供用户反馈。
我希望这对您有所帮助,并且我没有误解您的问题。
更新>>>
哎呀,我忘了提到最重要的部分......我有一个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
控件,在第二行中,我有一个ContentControl
显示与ViewModel
属性中设置的视图模型匹配的视图,然后我有一个自定义FeedbackControl
,当反馈到达时滑入和滑出视图。
这个难题的最后一块是将视图与视图模型链接起来。这是在App.xaml
文件中使用DataTemplate
对象完成的:
...
<DataTemplate DataType="{x:Type ViewModels:HomeViewModel}">
<Views:HomeView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
<Views:MainView />
</DataTemplate>
...