查看有关ViewModel的知识

时间:2015-06-18 14:37:49

标签: wpf mvvm

我需要将View(WPF窗口)中的方法连接到ViewModel中的事件。为了具体的VM类型并连接其事件,DirectCast对象DataContext是否违反了MVVM模式?如果是,有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

首先看一下视图中的方法。如果他们操纵视图,请考虑将属性添加到您在viewmodel中的事件中更改的viewmodel并将视图绑定到。这样,通过将视图绑定到属性,可以消除视图中代码的需要。

如果方法包含其他逻辑,请考虑将该逻辑移动到viewmodel。

在其他情况下,将DataContext转换为viewmodel或接口可以是有效选项,并且不违反MVVM模式。

向视图添加代码时,请考虑进行测试。自动/单元测试视图比测试视图模型更难。

答案 1 :(得分:0)

这并不违反MVVM模式,但更抽象越好,当然(不是因为MVVM,而是一般的良好做法)。

如果您在XAML上设置DataContext,则可以使用Interactivity EventTriggerCallMethodAction ...也许来保持抽象。但是如果你在代码隐藏(通过注入或其他)上设置它,你就可以将DataContext转换为已知类型,或者使用Reflection(我不会' t> _> )。

通常,为ViewModel创建一个接口,这样你就可以保持一个不错的抽象级别,只显示视图需要知道的内容而不是整个实现,对于大多数情况来说都足够了。

public interface IMyViewModel
{
    event EventHandler MyEvent;
}

public class MyViewModel : IMyViewModel
{
    public event EventHandler MyEvent;

    // More viewmodel related stuff

    protected virtual void OnMyEvent(EventArgs e)
    {
        if (MyEvent != null)
            MyEvent(this, e);
    }
}

public class MyWindow : Window
{
    public MyWindow(IMyViewModel viewModel)
    {
        this.DataContext = viewModel;
        InitializeComponent();
        (this.DataContext as IViewModel).MyEvent += MyEventHandler;
    }

    private void MyEventHandler(object sender, EventArgs e)
    {
        // Do view related stuff
    }

}