如何将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和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>
...