除了其他人之外,我还有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)中实现这一点,或者我只是遗漏了一些明显的东西?
答案 0 :(得分:0)
在MVVM中,模型肯定能够了解其他模型。实际上,您已在代码中执行此操作:WorkDay
具有WorkUnits
属性。
将另一个模型传递给您的模型是可以的。您可以创建一个设置Duration
字段的方法,该字段又绑定到视图。
答案 1 :(得分:-5)
使用命令。将您的逻辑放在命令中。 ViewModel不能包含任何改变状态的方法。对于MVVMLight,您可以阅读有关命令there
的信息