【发布时间】:2013-07-24 04:40:55
【问题描述】:
我在设计可扩展程序的架构时遇到了一些问题。
我正在使用 MEF、MMVM Light Toolkit 和 AvalonDock。
第一个问题是如何使用 MEF 从另一个程序集中导入一些 ViewModel 的显示视图。
为了解决这个问题,我导出了ResourceDictionary,我在其中为在这个程序集中声明的视图定义了DataTemplate。
Dictionary:
<ResourceDictionary
...>
<DataTemplate DataType="viewmodels:MyViewModel">
<views:MyViewForViewModel/>
</DataTemplate>
</ResourceDictionary>
在MainWindow 的构造函数中,我正在导入所有ResourceDictionaries 并将它们与MainWidow.ResourceDictionary 合并。
好吗?也可以指定ResourceDictionary 的“范围”,而不是将其导入到MainWindow,而是导入到Application,例如。
第二个问题是ICommands 和CommandBindings。
要填充Menu,我正在导出“MenuItems”,我在其中定义ICommand、Text 和其他内容,但我不知道如何导出CommandBinding,我应该使用RelayCommand 来处理以下情况我无法创建CommandBinding?
第三个问题是对话框。
我找到了很棒的文章 Showing Dialogs When Using the MVVM Pattern 并轻松地将其改编为 MEF。但是,例如,我有一个没有任何视图的IDatabaseService。
Workspace,主 ViewModel,存储IDatabaseService 的实例并创建菜单项:Connect to Database。使用 IDialogService 工作区打开一些导入的IConnectToDbDialog 所以Workspace 对此一无所知。当对话框关闭时,SqlConnectionString 应该被传递给IDatabaseService。
那么谁必须通过这个SqlConnectionString、IConnectToDbDialog 或Workspace。
第四个问题是如何与IDatabaseService正确通信。
例如。在某些视图中,我有Button:'在数据库中创建项目'。当单击按钮时,我应该如何调用IDatabaseService 方法CreateItem(ElementType elementType)?
问题是,有很多按钮在数据库中创建 Items 和不同的 ElementType,所以,我认为,使用参数创建一些 ICommand 并为此命令创建一个处理程序是正确的,它将调用一些IDatabaseService 中的方法。但我不知道怎么做。
另一种解决方案是从ViewModel 向IDatabaseService 发送消息以创建项目。
哪个更好?
【问题讨论】:
标签: wpf mvvm architecture mef