0

我已经完成了我的前几个 C# .NET MVVM 项目,我想继续这个。所以我认为让我自己的简单——比如说——我可以在我的大多数项目中放入我需要的 mvvm-stuff 的框架会很好。我创建了一些控件和其他有用的方法。到目前为止,一切都很好。

现在我想在我的框架中包含一个“通用”MainViewModel和一个MainWindowView,这应该在我的所有项目中为我提供相同的表面,我不知道最好的方法是什么。

MainViewModel应该是其他项目的基础。我已经声明了一个带有我总是需要的按钮(如显示、编辑、保存设置)的功能区菜单,并且我有一个方法,我可以通过一个方法调用将按钮添加到我的视图的功能区菜单中(AddButton(Command , Image, Label)),用于打开选项卡控件的命令、ReloadCommand、存储库的字段、DialogService 以及在此中注册工作区的方法ViewModel

我还有一个MainWindowView我的基本 UI,左侧有 RibbonMenue、StatusBar、ComboBoxes,我只想添加特定于应用程序的 TabItems!?

我真的不知道在使用框架的特殊应用程序中“指定”它的最佳方法是什么。我只是想继承,或带有属性的反射或类似的东西。

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

4

1 回答 1

1

我不确定我们是否在同一页面上,但我假设您的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>
...
于 2013-08-22T13:24:18.593 回答