【问题标题】:hang on an handler to an event handler in View将处理程序挂在 View 中的事件处理程序上
【发布时间】:2011-04-04 20:05:46
【问题描述】:

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

感谢您的帮助

【问题讨论】:

    标签: wpf events view viewmodel


    【解决方案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;
          }
       }
    }
    

    【讨论】:

    • 你是什么意思。 F.e. DataContextChanged(){...}
    • 注意我需要把签名改成这样:private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
    【解决方案2】:

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

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

    • MVVM 背后的整个想法是让 ViewModel假设 View 是“真实的”UI
    • 然而,通常情况下,View 真实的 UI(所以您提到的事件可能与 UI 中发生的事情有关)

    这让我认为您正在寻找一种让 ViewModel 从 View 订阅 UI 事件的方法,这与 MVVM 的前提背道而驰。

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

    【讨论】:

    • 您好 Jon,我在更改视图时遇到了问题。我有不同的页面。我有一个导航类,可以导航到每个页面。这个导航类在我的视图中,所以我不能从我的 ViewModel 中调用它。我在我的视图中需要这个,因为我将一些对象传递给我的新视图,所以我不能把我的导航类放在我的视图模型所在的位置。我希望我已经解释了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2013-12-24
    • 1970-01-01
    相关资源
    最近更新 更多