我需要将View(WPF窗口)中的方法连接到ViewModel中的事件。为了具体的VM类型并连接其事件,DirectCast对象DataContext是否违反了MVVM模式?如果是,有更好的方法吗?
答案 0 :(得分:1)
首先看一下视图中的方法。如果他们操纵视图,请考虑将属性添加到您在viewmodel中的事件中更改的viewmodel并将视图绑定到。这样,通过将视图绑定到属性,可以消除视图中代码的需要。
如果方法包含其他逻辑,请考虑将该逻辑移动到viewmodel。
在其他情况下,将DataContext转换为viewmodel或接口可以是有效选项,并且不违反MVVM模式。
向视图添加代码时,请考虑进行测试。自动/单元测试视图比测试视图模型更难。
答案 1 :(得分:0)
这并不违反MVVM模式,但更抽象越好,当然(不是因为MVVM,而是一般的良好做法)。
如果您在XAML上设置DataContext,则可以使用Interactivity EventTrigger
和CallMethodAction
...也许来保持抽象。但是如果你在代码隐藏(通过注入或其他)上设置它,你就可以将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
}
}