MVVM 中模型之间的依赖关系

Dependencies between models in MVVM

除其他外,我还有 2 个模型,WorkDay 和 Filter。 WorkDay 包含工作单位。当一个工作日中每个工作单元的持续时间相加时,您将得到工作日持续时间。此外,工作单位分配有标签以创建工作特定报告。要过滤标签,我有一个名为 filter 的模型,其中包含要过滤的标签列表。

现在我的问题是,我需要结合这两个模型。但据我了解 MVVM,只有 ViewModels 相互交互。模特不认识其他模特

工作日(大幅缩短):

public class WorkDay
{
    public List<WorkUnit> WorkUnits { get; set; }

    public TimeSpan Duration 
    {
        get 
        {
            var duration = TimeSpan.Zero;
            foreach (var workUnit in WorkUnits)
            {
                duration += workUnit.Duration;
            }
            return duration;
        }
    }
}

过滤器(大幅缩短):

public class Filter
{
    public List<String> Tags { get; set; }
}

为了将过滤器应用于持续时间,我需要将过滤器注入 WorkDay 的持续时间 属性,从而启用两个模型之间的连接。

public class WorkDay
{
    public List<WorkUnit> WorkUnits { get; set; }

    public TimeSpan Duration 
    {
        get 
        {
            var duration = TimeSpan.Zero;
            foreach (var workUnit in WorkUnits)
            {
                var filter = ...; // get filter from somewhere?
                if (workUnit.hasAtLeastOneTagFrom(filter))
                    duration += workUnit.Duration;
            }
            return duration;
        }
    }
}

过滤器不应是 WorkDay 中的 property/field,因为过滤器是可选应用的,并且可以再次删除。 IE。它仅用于计算和显示 UI 中的报告。所以实际数据没有改变。此外,UI 绑定到 Duration 属性,因此无法通过以下方式引入方法。

public TimeSpan GetDuration(Filter filter) { ... }

我如何在 MVVM (MVVMLight) 中实现这一点,或者我只是遗漏了一些明显的东西?

使用命令。将您的逻辑放在命令中。 ViewModel 不能包含任何改变状态的方法。对于 MVVMLight,您可以阅读有关命令 there

在 MVVM 中,模型肯定可以了解其他模型。实际上,您已经在代码中这样做了:WorkDay 有一个 WorkUnits 属性.

可以将另一个模型传递给您的模型。您可以创建一个方法来设置 Duration 字段,该字段又绑定到视图。