我不确定我们是否在同一页面上,但我假设您的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>
...
目前尚不清楚在这里你的问题是什么:这是使用
DataTemplate
对象在App.xaml
文件来完成。反射和属性从哪里来? –对不起,我编辑了这个问题。我有例如一些命令,我想在项目中指定它们 – Tobias
那么如果你想在框架中有一个虚拟机实现你必须考虑,为什么你想把它放在那里。你的'MainViewModel'有什么特别之处?你是否需要在其他项目中使用相同的实现? – DHN