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
字段,该字段又绑定到视图。
除其他外,我还有 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
字段,该字段又绑定到视图。