我在设计我的可扩展程序体系结构时遇到了一些问题。WPf,MEF体系结构设计
我正在使用MEF,MMVM Light Toolkit和AvalonDock。
第一个问题是如何显示某个ViewModel
从另一个使用MEF的程序集导入视图。 为了解决这个问题,我正在导出ResourceDictionary
,我在这个程序集中定义了DataTemplate
的视图。
Dictionary
:
<ResourceDictionary
...>
<DataTemplate DataType="viewmodels:MyViewModel">
<views:MyViewForViewModel/>
</DataTemplate>
</ResourceDictionary>
而且在MainWindow
我正在进口的所有ResourceDictionaries
与MainWidow.ResourceDictionary
合并它们的构造。 好吗?也可以指定ResourceDictionary
的“范围”,以便将其导入MainWindow
,而不是输入Application
。
第二个问题是ICommands
和CommandBindings
。 要填充Menu
在那里我定义ICommand
,Text
和其他的东西我我出口“的MenuItems”,但我不知道如何导出CommandBinding
,我应该使用RelayCommand
的情况下,当我无法创建CommandBinding
?
第三个问题是对话框。 我发现了很棒的文章Showing Dialogs When Using the MVVM Pattern,并很容易地将其应用于MEF。但是,例如,我有一个没有任何View的IDatabaseService
。 Workspace
,主ViewModel,存储实例IDatabaseService
并创建菜单项:Connect to Database
。使用IDialogService Workspace打开一些导入的IConnectToDbDialog
,所以Workspace
不知道任何关于它的内容。当对话框关闭时,应将SqlConnectionString
传递给IDatabaseService
。 那么谁必须通过这个SqlConnectionString
,IConnectToDbDialog
或Workspace
。
第四个问题是如何正确与IDatabaseService
进行通信。例如, 。在一些视图中,我有Button
:'在数据库中创建项目'。当点击按钮时,我应该如何调用IDatabaseService
方法CreateItem(ElementType elementType)
? 问题是,有很多按钮在数据库中创建了Items
与ElementType
不同,所以我认为创建一些带参数的ICommand
并且只为该命令创建一个处理程序是正确的,它将调用IDatabaseService
中的某个方法。但我不知道如何。 另一种解决方案是从ViewModel
发送消息到IDatabaseService
以创建项目。 哪种方式更好?
谢谢。 3和4的答案很明确,但我有一些关于1和2的问题,可能是我的错。 1.我也更喜欢XAML,但是在我的任务中我只能访问主程序源代码和通用接口,我没有访问视图或菜单或其他块源代码,所以我没有看到除我的任何其他解决方案。 – Towelie
2.我不知道该怎么做。我只能访问'IMenu'和'IMenuItem'接口和'MenuItem'类。在某些汇编中,我在'ResourceDictionary'中导出'Menu Menu:IMenu'和'DataTemplate'来在shell中显示菜单。并添加一些'IMenuItem'我从IoC中获取'IMenu'中的类MenuItem:IMenuItem'或调用方法'AddMenuItem(IMenuItem)',所以我无法在'Menu'下定义'CommandBindings'。我只能在代码中做到这一点,但这是有问题的,但可能的。 – Towelie
您在何处以及如何定义ICommand? –