MVVM中模型之间的依赖关系

时间:2015-03-09 07:05:56

标签: c# mvvm mvvm-light

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

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

WorkDay(大幅缩短):

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; }
}

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

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中的属性/字段,因为可选地应用过滤器,可以再次删除。即它仅用于在UI中计算和显示报告。所以实际数据不会改变。此外,UI绑定到Duration属性,因此无法以下列方式引入方法。

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

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

2 个答案:

答案 0 :(得分:0)

在MVVM中,模型肯定能够了解其他模型。实际上,您已在代码中执行此操作:WorkDay具有WorkUnits属性。

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

答案 1 :(得分:-5)

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

的信息