如何触发视图模型中的某些代码在视图中运行?

时间:2018-09-19 06:04:53

标签: wpf mvvm

视图模型“询问”视图以执行某项操作(例如操纵控件)的最佳方法是什么?我认为视图模型发送事件不会违反MVVM,因为所有INotifyPropertyChanged接口都是视图模型向事件发送事件的示例。

我意识到,从MVVM的角度来看,在视图中保留代码并不理想,因此我可以使用附加行为来操作特定的控件,但问题仍然存在-我如何要求附加行为来做某事从我的模型来看?

我可以在我的视图上具有布尔依赖项属性,其中属性更改的事件处理程序可以运行我需要运行的代码。然后,我可以将此属性绑定到视图模型上的属性,然后在每次触发代码运行时切换该属性的值。但是,这似乎是一种hack。

我可以在视图模型上发生一个事件,然后将该事件显式地附加到视图中的代码中的事件处理程序中,但这似乎是对MVVM的反对-我应该能够使用绑定来实现连接。

这一定是很常见的情况,有没有标准的解决方案?

1 个答案:

答案 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模式,因为视图模型知道并且仅依赖于接口。