用于将数据加载到 loosley 耦合视图及其视图模型/模型中的 MVVM 策略

本文关键字:模型 视图 策略 MVVM 加载 loosley 耦合 用于 数据 | 更新日期: 2023-09-27 18:30:23

我正在开发一个程序集,它将视图动态注入 WPF 应用程序内的已定义区域,我正在尝试完成以下操作:

在应用程序中,我希望能够将应用程序数据加载到视图及其视图模型的模型对象中。

然后,我想将模型数据保存在应用程序自己的数据存储机制中。

我最关心的是维护适合 MVVM 模式的松散耦合设计。我已经在我的应用程序中定义了一个区域,并且已经编写了程序集,以便将适当的视图动态注入到该区域中。问题是,据我了解,从应用程序的角度来看,视图可以是任何内容。此外,应用程序似乎不适合查看我的模型或视图的视图模型。

MVVM 中是否有适用于这种情况的内容?什么设计适合允许应用程序以某种方式与我的模型对话?

视图也可能是众多视图之一:理想情况下,我希望视图有多个实例,每个实例提供模型实例的视图。理想情况下,应用程序应该能够在任何给定时间将数据加载到所选模型中或从中选择。

如果我在这篇文章中没有包含足够的内容,我深表歉意 - 我试图让它足够笼统以避免项目的细节。如果被问到,我很乐意澄清或提供更多信息。

用于将数据加载到 loosley 耦合视图及其视图模型/模型中的 MVVM 策略

为了使您的组件位于 shell 中而两者之间没有任何通信,您需要将特定模块的所有逻辑(保存/加载等)放入该模块中。

但是,很有可能让 shell 在不耦合实现的情况下与插件进行通信,尽管您可能需要考虑在两者之间建立一些通用机制。

最有可能的是,

您需要为您的 shell 项目提供一个可扩展性框架库,其中包含一个可以对其进行编程的通用 API,以便更好地集成您的插件

MEF允许您非常轻松地进行插件发现/加载等。在设计插件样式框架时,接口是你的朋友。让你的插件实现一个特定的接口意味着你的shell可以与插件对话,同时与插件的实际功能无关。

一个简单的例子可能是工具栏的命令集合(每个插件都可以向工具栏注册命令,工具栏将根据可用的命令动态创建按钮):

在您的扩展性库中(shell 和插件都引用此库):

public interface IProvideCommands
{
    public IList<IToolBarCommand> AvailableCommands { get; }       
}

您可能还需要一个标记接口,让 shell 应用程序知道插件程序集中的哪些 ViewModel 类型是它应该加载到动态区域中的类型(您在某种程度上已经这样做了,您是如何实现的?

public interface IPluginShell { }

在插件主虚拟机中:

public class SomePluginViewModel : IPluginShell, IProvideCommands
{
    public IList<IToolBarCommand> AvailableCommands { get; private set; } // Populate this etc
}

在你的外壳中:

public class ApplicationShell
{
    public ApplicationShell() 
    {
        // Load plugins
        ....
        // Discover commands
        var commandProvider = SomePlugin as IProvideCommands;
        if(commandProvider != null)
        {
            DoStuffWith(commandProvider.Commands);
        }
    }
}

然后,命令受插件的摆布 - 它们可以指示哪些命令可用于 shell,而不是 shell 必须知道有关 VM 本身的任何信息。

让我知道这是否有帮助