2013-07-24 76 views
2

我在设计我的可扩展程序体系结构时遇到了一些问题。WPf,MEF体系结构设计

我正在使用MEF,MMVM Light Toolkit和AvalonDock。

第一个问题是如何显示某个ViewModel从另一个使用MEF的程序集导入视图。 为了解决这个问题,我正在导出ResourceDictionary,我在这个程序集中定义了DataTemplate的视图。

Dictionary

<ResourceDictionary 
    ...> 
    <DataTemplate DataType="viewmodels:MyViewModel"> 
    <views:MyViewForViewModel/> 
    </DataTemplate> 
</ResourceDictionary> 

而且在MainWindow我正在进口的所有ResourceDictionariesMainWidow.ResourceDictionary合并它们的构造。 好吗?也可以指定ResourceDictionary的“范围”,以便将其导入MainWindow,而不是输入Application

第二个问题是ICommandsCommandBindings。 要填充Menu在那里我定义ICommandText和其他的东西我我出口“的MenuItems”,但我不知道如何导出CommandBinding,我应该使用RelayCommand的情况下,当我无法创建CommandBinding

第三个问题是对话框。 我发现了很棒的文章Showing Dialogs When Using the MVVM Pattern,并很容易地将其应用于MEF。但是,例如,我有一个没有任何View的IDatabaseServiceWorkspace,主ViewModel,存储实例IDatabaseService并创建菜单项:Connect to Database。使用IDialogService Workspace打开一些导入的IConnectToDbDialog,所以Workspace不知道任何关于它的内容。当对话框关闭时,应将SqlConnectionString传递给IDatabaseService。 那么谁必须通过这个SqlConnectionString,IConnectToDbDialogWorkspace

第四个问题是如何正确与IDatabaseService进行通信。例如, 。在一些视图中,我有Button:'在数据库中创建项目'。当点击按钮时,我应该如何调用IDatabaseService方法CreateItem(ElementType elementType)? 问题是,有很多按钮在数据库中创建了ItemsElementType不同,所以我认为创建一些带参数的ICommand并且只为该命令创建一个处理程序是正确的,它将调用IDatabaseService中的某个方法。但我不知道如何。 另一种解决方案是从ViewModel发送消息到IDatabaseService以创建项目。 哪种方式更好?

回答

2

试着回答你的问题。

  1. 这很好。您可以在XAML或代码后面进行合并,但我更喜欢XAML。您可以将它放在主窗口范围内的MainWindow.Xaml上或应用范围内的App.Xaml上。

  2. 我以前没有导出视图。在我看来,如果你把CommandBindings放在Menu下面,当它被导出的时候并不重要,如果导入环境范围内的事件处理器被导入的话,它并不重要。

  3. 这取决于。理论上你可以把服务调用放在所有者的视图模型或对话框的视图模型中。例如,如果您的对话框具有创建/提交按钮,并且您希望对话框保持活动状态,直到提交成功为止,然后将其置于对话框的视图模型中,以便在处理异常时保持其打开状态。如果不需要对话框保持打开状态,那么可以在关闭对话框后将逻辑放入所有者视图模型中。

  4. 命令更好。考虑到视图模型从IoC容器获取IDatabaseService对象,您可能有一个接受ElementType参数的ICommand属性,或者参数可映射到ElementType。在execute方法中,您可以直接调用CreateItem或从mapper中传递参数。在你的XAML上,你输入了命令绑定。是否有意义?

希望它能提供帮助。

+0

谢谢。 3和4的答案很明确,但我有一些关于1和2的问题,可能是我的错。 1.我也更喜欢XAML,但是在我的任务中我只能访问主程序源代码和通用接口,我没有访问视图或菜单或其他块源代码,所以我没有看到除我的任何其他解决方案。 – Towelie

+0

2.我不知道该怎么做。我只能访问'IMenu'和'IMenuItem'接口和'MenuItem'类。在某些汇编中,我在'ResourceDictionary'中导出'Menu Menu:IMenu'和'DataTemplate'来在shell中显示菜单。并添加一些'IMenuItem'我从IoC中获取'IMenu'中的类MenuItem:IMenuItem'或调用方法'AddMenuItem(IMenuItem)',所以我无法在'Menu'下定义'CommandBindings'。我只能在代码中做到这一点,但这是有问题的,但可能的。 – Towelie

+0

您在何处以及如何定义ICommand? –