如何将MainViewModel和MainWindowView添加到自己的框架中
本文关键字:自己的 框架 添加 MainWindowView MainViewModel | 更新日期: 2023-09-27 18:28:30
我已经完成了我的第一对C#.NET MVVM项目,我想继续做下去。因此,我认为制作自己的简单框架(比如说)会很好,在这个框架中,我可以放置我在大多数项目中需要的mvvm内容。我创建了一些控件和其他有用的方法。到目前为止还不错。
现在我想包括一个"通用"MainViewModel
和一个MainWindowView
,这应该会在我的框架中为我的所有项目提供相同的表面,我不知道什么是最好的方法。
这个MainViewModel
应该是其他项目的基础。我已经声明了一个功能区菜单,其中包含我一直需要的按钮(如显示、编辑、保存设置),并且我在其中有一个方法,我可以通过一个方法调用(AddButton(Command,Image,Label))、一个打开tabcontrol的命令、一个ReloadCommand、Fields to Repository、一个DialogService和在该ViewModel
中注册工作区的方法将按钮添加到视图的功能区菜单中。
我还有一个MainWindowView
,在那里我有我的基本UI,左边有RibbonMenue、StatusBar、ComboBoxes,我只想添加特定于应用程序的TabItems!?
我真的不知道在使用该框架的特殊应用程序中"指定"这一点的最佳方式是什么。我只是想到了继承,或者属性反射之类的东西。
在框架中使用MainViewModel和MainWindowView的最佳方式是什么?
我不确定我们是否在同一页上,但我假设您的MainViewModel
类类似于"基本视图模型"类。我在MVVM项目中有一个通用BaseViewModel
类,但我也有通用BaseDataType
类,它们(两者)将INotifyPropertyChanged
接口公开给扩展类。
在我的应用程序中,我有一系列实现Singleton模式的Manager
类(例如,每个类只能有一个)。BaseViewModel
类将这些有价值的管理器类公开给扩展视图模型类。每个管理器类都提供了一些进一步的功能。例如,请参阅以下列表:
StateManager:维护整个应用程序的全局数据/对象状态
DependencyManager:维护与接口集合及其具体实现的依赖关系
FeedbackManager:维护对应用程序反馈控制的访问(用于用户反馈)
WindowManager:提供对文件对话框和子窗口管理的访问
剪贴板管理器:提供对计算机剪贴板的访问
UiThreadManager:提供对多线程的访问
EmailManager:提供能够发送电子邮件的访问权限
硬盘管理器:提供对用户计算机硬盘的访问
ExportManager:提供对XML生成和FTP传输的访问
DataOperationManager:提供对所有数据操作的访问(下面将进一步解释)
UpdateManager:提供对应用程序更新的访问
SecurityManger:提供对所有安全事务的访问
ExcelManager:提供对基于视图模型数据生成Excel文档的功能的访问。
所有这些管理器类都可以从任何扩展BaseViewModel
类的视图模型中访问。
除此之外,我的(抽象)BaseViewModel
还公开了每个视图中所需的某些Command
对象,如"保存"、"删除"、"刷新"等。
最后,它还提供了对常用功能的访问,如"InsertNewDataTypeToCollection"answers"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>
...