在这个假设的问题中,假设 ViewModel 发布了一个 View 订阅的相当复杂的事件。然后,视图根据该事件中的状态操作多个屏幕元素。例如,使几个按钮可见/隐藏,或启用/禁用,或者可能启动故事板。
// purely as an example:
public class SomeEvent
{
public bool ShouldShowAddButton { get; set; }
public bool ShouldShowDeleteButton { get; set; }
public bool AddButtonEnabled { get; set; }
public bool DeleteButtonEnabled { get; set; }
}
由于虚拟机对视图一无所知,因此它实际上无法进入并执行这些操作,而是依赖于事件。我认为标准的 MVVM 实践。(另一种选择是让这些项目中的每一个都成为自己发布的事件,一个接一个地发送。)
但是,如果 VM 可以在不了解 View 的情况下调用 View 怎么办?
public class MyViewModel
{
public Action OnShowAddButton { get; set; }
public Action OnShowDeleteButton { get; set; }
...etc
private void OnSomeStateChange()
{
// here, we'd normally publish the SomeEvent class
// instead, we could just call OnShowAddButton (or whatever) instead
}
}
public class MyView
{
public MyView()
{
this.myViewModel.OnShowAddButton = () => ...;
...etc
}
}
除了不是 MVVM 设计的“典型”之外,是否有理由对此表示不满?据我所知,它仍然保持正确的分离水平。