gpt4 book ai didi

WPf, MEF 架构设计

转载 作者:行者123 更新时间:2023-12-03 10:16:19 25 4
gpt4 key购买 nike

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

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

第一个问题是如何显示某些 ViewModel 的 View 使用 MEF 从另一个程序集导入。
为了解决它,我正在导出 ResourceDictionary我在哪里定义 DataTemplate用于在此程序集中声明的 View 。
Dictionary :

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

MainWindow 的构造函数中我正在导入所有 ResourceDictionaries并将它们与 MainWidow.ResourceDictionary 合并.
好吗?也可以指定 ResourceDictionary 的“范围”。不导入到 MainWindow , 但到 Application例如。

第二个问题是 ICommandsCommandBindings .
填充 Menu我正在导出定义 ICommand 的“MenuItems” , Text和其他东西,但我不知道如何导出 CommandBinding , 我应该使用 RelayCommand对于我无法创建 CommandBinding 的情况?

第三个问题是对话框。
我找到了很棒的文章 Showing Dialogs When Using the MVVM Pattern并轻松适应 MEF。但是,例如,我有一个 IDatabaseService没有任何 View 。 Workspace ,主 ViewModel,存储 IDatabaseService 的实例并创建菜单项: Connect to Database .使用 IDialogService 工作区打开一些导入的 IConnectToDbDialog所以 Workspace对此一无所知。当对话框关闭时, SqlConnectionString应该传递给 IDatabaseService .
那么谁必须通过这个 SqlConnectionString , IConnectToDbDialogWorkspace .

第四个问题是如何与 IDatabaseService通信正确。
例如。在某些 View 中,我有 Button :'在数据库中创建项目'。我应该如何调用 IDatabaseService方法 CreateItem(ElementType elementType)什么时候点击按钮?
问题是有很多按钮会创建 Items与不同 ElementType在数据库中,所以,我认为,创建一些 ICommand 是正确的使用参数并为此命令只创建一个处理程序,它将调用 IDatabaseService 中的某些方法.但我不知道怎么做。
另一种解决方案是向 IDatabaseService 发送消息。来自 ViewModel创建项目。
哪种方式更好?

最佳答案

试着回答你的问题。

  • 这很好。您可以在 XAML 或代码后面合并,但我更喜欢 XAML。您可以将它放在 MainWindow.Xaml 上,它在主窗口范围内或 App.Xaml 上,它在应用程序范围内。
  • 我之前没有导出 View 。在我看来,如果您将 CommandBindings 放在 Menu 下,如果事件处理程序在导入的环境范围内,则何时导出然后导入都没有关系。
  • 这取决于。从理论上讲,您可以将服务调用放在所有者的 View 模型或对话框的 View 模型中。例如,如果您的对话框有一个创建/提交按钮,并且您希望对话框在提交成功之前保持事件状态,则将其放入对话框的 View 模型中,以便在处理异常时可以保持打开状态。如果您不需要对话框保持打开,那么您可以在对话框关闭后将逻辑放在所有者的 View 模型中。
  • 指挥更好。考虑到 View 模型从 IoC 容器中获取 IDatabaseService 对象,您可能有一个接受 ElementType 参数的 ICommand 属性,或者一个参数可以映射到 ElementType。在执行方法中,您调用 CreateItem 直接或从映射器传递参数。在您的 XAML 上,您将 type 放入命令绑定(bind)中。是否有意义?

  • 希望它可以提供帮助。

    关于WPf, MEF 架构设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17838519/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com