【问题标题】:Calling a method from a different ViewModel从不同的 ViewModel 调用方法
【发布时间】:2017-10-10 18:40:27
【问题描述】:

我正在编写一个用于管理工具库存的程序,当我让用户将工具标记为“已修复”时遇到了问题。

程序应该如下工作:

使用 TIView、TIViewModel、TIModel:

  1. 员工检查工具。
  2. 工具在使用过程中碰巧损坏。
  3. Employee return 是将其标记为损坏并报告问题的工具。
  4. 该工具被标记为已退回并锁定,直到修复为止。

使用 VPRView、VPRViewModel 和 VPRModel:

  1. 检查员进入数据网格,显示所有有问题的工具。
  2. 检查员纠正问题,将工具标记为已修复,然后提交数据。

  3. 程序使用检查员 ID 号、他们的解决方案更新 SQLite 数据库,将问题标记为已解决并记录完成日期/时间。


问题步骤:

8.然后程序从 TIViewModel 运行 PopulateToolInventory 方法来更新库存列表,从而使工具不再被锁定。


总结:

当检查员将工具标记为已修复时,将使用 VPRView、VPRViewModel 和 VPRModel 更新数据库。在 TIViewModel 中可以找到为工具清单拉取数据的方法。通过 VPRViewModel 将数据上传到数据库后,如何让应用程序从 VPRViewModel 执行“PopulateToolInventory”方法?

代码示例:

VPRViewModel:

    public void SubmitSolution()
    {
        VPRModel vprm = new VPRModel();
        vprm.SubmitProblemSolution(ProblemSolved, ProblemSolution, InspectorID, SelectedReport[0].ToString());
        ProblemReports = vprm.RetrieveProblemReports();
        InspectorID = null;
        ProblemSolution = null;
        ProblemSolved = false;
        MessageBox.Show("Solution successfully recorded!", "Success!", MessageBoxButton.OK);
        // This is where I would want to call the method from the TIViewModel to update the data grid on the TIView.
    }

TIViewModel:

private DataTable _toolInventory;
public DataTable ToolInventory
    {
        get { return _toolInventory; }
        set
        {
            _toolInventory = value;
            NotifyOfPropertyChange(() => ToolInventory);
        }
    }

public void PopulateToolInventory()
    {
        TIModel tim = new TIModel();
        ToolInventory = tim.RetrieveToolInventory();
    }

ShellViewModel:

class ShellViewModel : Conductor<object>
{
    public void Open_ToolInventory()
    {
        ActivateItem(new TIViewModel());
    }
    public void ViewProblemReport()
    {
        WindowManager wm = new WindowManager();
        VPRViewModel vprvm = new VPRViewModel();
        wm.ShowDialog(vprvm);
    }
}

仅供参考:如果这对任何解决方案有帮助,我正在使用 Caliburn.Micro。

希望这是足够的信息。如果没有,就问你需要什么!另外,请不要活着吃我的代码。我是自学成才的,我知道我离专业开发人员还很远,但这是我的热情所在,我真的很享受。感谢建设性的批评,请不要让我觉得自己很愚蠢。

【问题讨论】:

  • 这看起来可能是一个解决方案。不过,一旦在 TIViewModel 上建立了 EventAggregator,我很难理解如何通过 EventAggregator 实际调用该方法。
  • TIViewModel 的实例在哪里?它和VPRViewModel 实例都是同一个父母的孩子吗?如果是这样,给VPRViewModel 一个SolutionSubmitted 事件,并让父级设置一个处理程序,使TIViewModel 做它需要做的任何事情。或者你有一个视图创建自己的视图模型的方案,所以它们不能互相交谈?后者是个坏主意。它使 MVVM 倒退。不要用事件聚合器或定位器接触任何东西;这些都是拜占庭式的、不必要的杂物,旨在实现以视图为中心的设计的反模式。
  • @EdPlunkett 它们都是由 ShellViewModel 创建的。 ShellViewModel 在创建时创建 TIViewModel 和 TIView 并将它们放置在内容区域中。 VPRViewModel 和 VPRView 都是稍后通过菜单项创建的。我将更新问题以向您展示 ShellViewModel 代码。
  • 如果 ShellViewModel 将它们都创建并保留对它们的引用,那么问题就很简单了。

标签: c# wpf mvvm caliburn.micro


【解决方案1】:

在问题 cmets 中使用 Ed 的想法,我做了以下事情。

class ShellViewModel : Conductor<object>
{
    public void Open_ToolInventory()
    {
        ActivateItem(new TIViewModel());
    }
    public void ViewProblemReport()
    {
        WindowManager wm = new WindowManager();
        VPRViewModel vprvm = new VPRViewModel();
        wm.ShowDialog(vprvm);
    }
}

改为:

class ShellViewModel : Conductor<object>
{
    TIViewModel tivm = new TIViewModel();
    VPRViewModel vprvm = new VPRViewModel();

    public void OpenToolInventory()
    {
        ActivateItem(tivm);
    }
    public void ViewProblemReport()
    {
        WindowManager wm = new WindowManager();
        wm.ShowDialog(vprvm);
        tivm.PopulateToolInventory();
    }
}

这会在对话框关闭后运行目标方法,更新工具清单以立即反映所有已解决的问题。你是最棒的,艾德!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2021-11-18
    • 2021-03-14
    • 1970-01-01
    • 2013-11-12
    相关资源
    最近更新 更多