gpt4 book ai didi

c# - 使用 viewmodel 命令打开新选项卡

转载 作者:行者123 更新时间:2023-12-03 10:29:58 24 4
gpt4 key购买 nike

我有一个应用程序,其中我有一个主视图模型,其 View 包含一个选项卡控件,其中每个选项卡都有自己的 View 和 View 模型(可能还有更多)。我相信这是一个很常见的设计。现在,我想通过从这些选项卡内的控件触发命令来打开新选项卡(通过实例化新 View 模型并将它们添加到工作区集合中)。问题是命令是由控制选项卡的内部 View 模型接收的,而不是控制选项卡控件的外部 View 模型。这样做的最佳做法是什么?我能想到的所有解决方案都是一种“hacky”(为 View 模型提供对其父 View 模型的引用,从父 View 订阅 child 的事件......)。我假设有一个很好的解决方案。

例如,从“实体列表” View 中,单击“新建”按钮或选择一行应打开另一个具有“实体详细信息”类型 View 的选项卡。但是,该命令将由选项卡绑定(bind)到的“实体列表” View 的 View 模型接收,而不是选项卡控件绑定(bind)到的“工作区列表” View 模型。

最佳答案

一种可能性是让您的外部 View 模型公开命令以创建新选项卡。我们使用一个集中的 CommandService,它只是一个 name-to-ICommand 的字典,它允许解耦全局命令。像这样的东西:

public interface ICommandService
{
void RegisterCommand(string name, ICommand command);
ICommand this[string name] {get;}
}

public class OuterViewModel
{
public OuterViewModel (ICommandService commandService)
{
commandService.RegisterCommand("OpenNewTab", OpenNewTab);
}

private void OpenNewTab (object newTabViewModel)
{
// The new tab's viewmodel is sent as the ICommand's CommandParameter
}
}

public class InnerViewModel
{
public InnerViewModel (ICommandService commandService)
{
_commandService = commandService; // Save injected service locally.
}

public HandleClickOnInnerTabpage()
{
AnotherViewModel newVM = new AnotherViewModel(...);
_commandService["OpenNewTab"].Execute(newVM);
}
}

关于c# - 使用 viewmodel 命令打开新选项卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9357688/

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