【发布时间】:2011-04-04 20:05:46
【问题描述】:
我想向我的事件处理程序添加一个事件。问题是我的 EventHandler 在我的 ViewModel 中,而我的 Event 在 View 中。如何从 View 访问我的 ViewModel 以挂起此事件?
感谢您的帮助
【问题讨论】:
我想向我的事件处理程序添加一个事件。问题是我的 EventHandler 在我的 ViewModel 中,而我的 Event 在 View 中。如何从 View 访问我的 ViewModel 以挂起此事件?
感谢您的帮助
【问题讨论】:
由于视图模型设置为视图的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;
}
}
}
【讨论】:
通常在 MVVM 中,当视图想要将某些操作推迟到 ViewModel 时,它通过绑定到 ICommand 来实现。这与事件的使用模型基本相同,因为 View 将通知“推送”到 ViewModel。
根据事件的性质,我建议您考虑使用 ICommand 执行此操作,因为:
这让我认为您正在寻找一种让 ViewModel 从 View 订阅 UI 事件的方法,这与 MVVM 的前提背道而驰。
在您的情况下,在 ViewModel 上调用命令有问题吗?
【讨论】: