挂起处理程序到View中的事件处理程序

时间:2011-04-04 20:05:47

标签: wpf events view viewmodel

我想在事件处理程序中添加一个事件。问题是我的EventHodeler在我的ViewModel中,我的事件在View中。如何从View访问我的ViewModel以挂起此事件?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

由于视图模型设置为视图的DataContext,您可以订阅视图的DataContextChanged,并在处理程序中将DataContext转换为视图模型的类型并附加期望事件处理程序像这样:

public class MyView : UserControl
{
   public MyView()
   {
       InitializeComponent();

       DataContextChanged += OnDataContextChanged;
   }

   private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
   {
      MyViewModel viewModel = DataContext as MyViewModel;

      if (viewModel != null) 
      {
          viewModel.MyEvent += OnMyEvent;
      }
   }
}

答案 1 :(得分:1)

通常在MVVM中,当View想要将某些操作推迟到ViewModel时,它通过绑定到ICommand来实现。这与使用事件的用法模型基本相同,因为View会将通知“推送”到ViewModel。

根据事件的性质,我建议您考虑使用ICommand进行,因为:

  • MVVM背后的整个想法是让ViewModel 而不是假设View是“真正的”UI
  • 但是,通常情况下,View 真实用户界面(因此您提及的事件可能与用户界面中发生的事情有关)

这让我觉得你正在寻找一种方法让ViewModel订阅来自View的UI事件,这与MVVM的前提相反。

在您的情况下调用ViewModel上的命令是否有问题?