2013-08-22 28 views
0

我做了我的第一对C#.NET MVVM项目,我想继续这个。所以我认为这会很好,让我自己的简单 - 让我们说 - 框架,我可以把mvvm东西,我需要在我的大部分项目。我创建了一些控件和其他有用的方法。到现在为止还挺好。如何将MainViewModel和MainWindowView添加到自己的框架中?

现在我想包括一个“通用”MainViewModelMainWindowView,这应该给我所有我的项目到我的框架相同的表面,我不知道最好的办法做到这一点。

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

我也有一个MainWindowView在那里我有一个RibbonMenue,StatusBar,组合框左边的基本UI,我只想添加特定于应用程序的TabItems !?

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

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

+2

目前尚不清楚在这里你的问题是什么:这是使用DataTemplate对象在App.xaml文件来完成。反射和属性从哪里来? –

+0

对不起,我编辑了这个问题。我有例如一些命令,我​​想在项目中指定它们 – Tobias

+1

那么如果你想在框架中有一个虚拟机实现你必须考虑,为什么你想把它放在那里。你的'MainViewModel'有什么特别之处?你是否需要在其他项目中使用相同的实现? – DHN

回答

1

我不确定我们是否在同一页面上,但我假设您的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> 
... 
+0

是的,我们正确的方式。 :)所以你有一个叫做BaseViewModel的抽象ViewModel,你把那个管理器放进去了。你是否也知道我可以如何处理它,当我还有一个MainWindowView时,我有一个RibbonMenue,一个StatusBar和左边的ComboBoxes只想添加特定于应用程序的TabItems?你明白我的意思吗? :) – Tobias

+0

我已经为你更新了我的答案。 – Sheridan

+0

好的,你用viewmodel属性来处理它。看起来不错:)非常感谢这个详细的答案! – Tobias

相关问题