视图模型“询问”视图以执行某项操作(例如操纵控件)的最佳方法是什么?我认为视图模型发送事件不会违反MVVM,因为所有INotifyPropertyChanged接口都是视图模型向事件发送事件的示例。
我意识到,从MVVM的角度来看,在视图中保留代码并不理想,因此我可以使用附加行为来操作特定的控件,但问题仍然存在-我如何要求附加行为来做某事从我的模型来看?
我可以在我的视图上具有布尔依赖项属性,其中属性更改的事件处理程序可以运行我需要运行的代码。然后,我可以将此属性绑定到视图模型上的属性,然后在每次触发代码运行时切换该属性的值。但是,这似乎是一种hack。
我可以在视图模型上发生一个事件,然后将该事件显式地附加到视图中的代码中的事件处理程序中,但这似乎是对MVVM的反对-我应该能够使用绑定来实现连接。
这一定是很常见的情况,有没有标准的解决方案?
答案 0 :(得分:1)
例如,您可以使用事件聚合器或Messenger来从视图模型发送事件或消息,以松散耦合的方式处理视图。视图和视图模型都只知道事件聚合器,但彼此一无所知。有关该概念的更多信息,请参阅this blog post。
另一种常见方法是在视图中实现一个接口,并使用该接口注入视图模型,例如:
public interface IDoSomething
{
void DoSomething();
}
public partial class Window1 : Window, IDoSomething
{
public Window1()
{
InitializeComponent();
DataContext = new ViewModel(this);
}
public void DoSomething()
{
//do something...
}
}
public class ViewModel
{
public ViewModel(IDoSomething doSomething)
{
//...
}
}
这不会破坏MVVM模式,因为视图模型知道并且仅依赖于接口。