首页 > 解决方案 > 通过 IoC 将函数注入视图模型的命令

问题描述

应用程序设计

该应用程序是一个包含 x 个选项卡的窗口。每个选项卡都有一个视图,其中包括另一个名为“LiveComment”的视图。

描述 :

MainWindowLogic:负责保存所有数据逻辑。函数 AddComment(String comment, DateTime time, String NameOfTheTab) 是通过接口(比如 IAddComment)编写的。此逻辑可通过 IoC 容器访问:IoC.Current 返回 MainWindowLogic 的实例。

MainWindowViewModel : 保存所有视图,没什么特别的

TabViewModel:包含一个“LiveCommentView”和一个字符串 NameOfTheTab

LiveCommentViewModel:包含一个字符串注释、一个 DateTime 时间和一个 ICommand 发送。Send 命令用于将评论和时间推送到逻辑中。

逻辑

当用户在选项卡中并按下 LiveComment 的发送按钮时,必须使用 LiveComment 的时间和评论以及 LiveComment 所在的 NameOfTheTab 调用逻辑。

问题

由于我想使用 MVVM 模式,我的所有视图都应该能够通过 IoC (IoC.Current) 获取当前的应用程序逻辑。然后在每个“LiveCommentViewModel”中,我都可以从 MainWindowLogic 访问 AddComment 方法。问题是 AddComment 需要 3 个参数,而“LiveCommentViewModel”只有 2 个。最后一个位于“TabViewModel”(选项卡的名称)中。

如何访问选项卡的名称?由于 MVVM,“LiveCommentViewModel”不知道“TabViewModel”(然后是 nameOfTab)。

现在,我的解决方案是创建一个带参数的构造函数:

    public LiveCommentViewModel(Action<String,DateTime> Send)
    {
        SendCommand = new RelayCommand(() => { SendMethod(Send); });
    }

然后将 Action send 初始化到 TabViewModel 中(这样做,我移除了 IoC 的功能......)

CommentBox = new LiveCommentViewModel((comment,TimeOfComment) => { SendCommentFunction(comment, TimeOfComment, Name); });

然后可以在 IoC 中找到“SendCommentFunction”

如果不够清楚,请告诉我。

编辑

我已经代表了我目前拥有的图像。这表明我的 MainWindowViewModel 创建并将所有内容推送到 IoC 中。当我的视图被加载时,每个 TabViewModel 或 LiveCommentViewModel 都试图通过调用 IoC 来获取它们各自的 DataContext(如果我很好理解的话,这是 MVVM)

正因为如此,我有一个限制。当用户调用发送命令时,我想使用 MainWindowViewModel 中的“AddComment”,但它需要我没有的 NameOfTheTab。 在此处输入图像描述

@Andy 的解决方案意味着我必须在 LiveCommentViewModel 中创建 ICommand 函数时在 MainWindowViewModel 中注入它,这当然可以工作(谢谢你)。但这是一个好方法吗?

标签: c#wpfmvvminversion-of-control

解决方案


推荐阅读