【问题标题】:How to add a MainViewModel and a MainWindowView into an own Framework? [closed]如何将 MainViewModel 和 MainWindowView 添加到自己的框架中? [关闭]
【发布时间】:2013-08-24 20:15:37
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 不清楚你的问题是什么。反射和属性从何而来?
  • 抱歉,我编辑了这个问题。我有例如一些命令,我​​想在项目中指定它们
  • 好吧,如果你想在你必须考虑的框架中有一个 VM 实现,为什么要把它放在那里。你的MainViewModel 有什么特别之处?您是否需要在其他项目中进行相同的实现?
  • 应该是其他项目的基础。我有一个声明的功能区菜单,其中包含我总是需要的按钮(如显示、编辑、保存设置),并且我有一个方法,我可以通过一个方法调用将按钮添加到视图的功能区菜单中(AddButton(命令,图像,标签)),用于打开选项卡控件的命令,...我在所有其他项目中都需要这些东西,所以我认为将它放在一个简单的框架中会很好。你认为这不是一个好主意吗?
  • 那么问题出在哪里?将类放入程序集中并在任何你喜欢的地方使用。

标签: c# .net wpf mvvm frameworks


【解决方案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、异步操作以及错误记录和处理中提供用户反馈。

我希望这对您有所帮助,并且我没有误解您的问题。

更新>>>

哎呀,我忘了提到最重要的部分...我有一个扩展 BaseViewModel 并显示在 MainWindow.xaml 中的 MainViewModel 类。在这个视图模型中,有一个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>
...

【讨论】:

  • 是的,我们走对了。 :) 所以你有一个名为 BaseViewModel 的抽象 ViewModel,你可以在其中放置管理器。你是否也知道当我还有一个 MainWindowView 时我可以如何处理它,其中我的基本 UI 带有 RibbonMenue、StatusBar 和 ComboBoxes 在左侧并且只想添加特定于应用程序的 TabItems?你明白我的意思吗? :)
  • 我已经为你更新了我的答案。
  • 好的,你可以使用 viewmodel-property 来处理它。看起来不错:) 非常感谢这个详细的答案!
  • 抱歉另一个问题,但是您知道如何从 xaml 代码中的视图继承吗?那可能吗?解释:我想在我的框架中有一个BaseViewWindow。我想在我的应用程序中有UserControls,它显示在我的BaseViewWindowTabCommands 中。所以我想在我的Framework 中使用View,而不是在每个应用程序中创建相同的视图。
  • 除了最后一条评论:我已经阅读了您的问题:stackoverflow.com/questions/5916930/… 那么我是否可以在我的框架中创建 BaseViewWindow,在我的应用程序中创建 MainViewWindow像 daub815 在他的回答中提到的 ViewContainer 之类的东西,其余的是在 TabCommands 中打开的一些 UserControls?如果这是可能的,我不知道如何在我的应用程序中调用BaseViewWindow。也许在 App.xaml 中作为 StartupUri?
猜你喜欢
  • 2018-12-10
  • 2018-10-28
  • 2012-06-29
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 2018-06-27
  • 2015-01-19
  • 2016-08-04
相关资源
最近更新 更多