可以从MVVM中的View订阅ViewModel的.NET事件吗?

时间:2013-04-30 12:30:23

标签: wpf events mvvm viewmodel

我正在使用MVVM模式编写此major memory trainer,方法是在屏幕上设置包含2位数字的标签,并要求用户快速输入每个数字的相应助记符。这完全取决于View如何完成动画,因此会有一些代码。当在UI中输入正确的助记符或者当数字从屏幕上消失时,将从视图执行命令以继续发生这种情况。

在ViewModel中,我想定期触发查看动画的新数字(随意)。

实现这一目标的最佳方法是什么?我可以有一个ObservableCollection<>在ViewModel中我想做的不仅仅是绑定到它,我需要在添加和删除数字时在代码中执行一个方法。

是否符合MVVM在ViewModel中使用简单的.NET事件并使用以下内容订阅它们:DataContext.NumberAdded + = new NumberAddedEventHandler(....)或者我应该采用另一种方式吗?

3 个答案:

答案 0 :(得分:2)

View是一个用户友好的ViewModel反映。如果您要运行特定于视图的逻辑(例如触发动画),则没有理由不使用代码隐藏来运行它。

如果您将UI和数据层分开,那就没问题了。

也就是说,如果你只是从View层使用它,那么从ViewModel中提供NumberAdded事件对我来说并没有多大意义。这会混淆你的图层。

相反,我只会使用常规CollectionChanged

((MyViewModel)this.DataContext).Numbers.CollectionChanged += 
    new CollectionChangedEventHandler(....);

根据您的集合绑定到UI的方式,您也可以使用UI事件,或者可能使用触发器。

我认为带有ItemsSource的元素会在添加或删除项目时引发事件,或者您只需将ItemsSource属性转换为集合并挂钩CollectionChanged事件无需参考MyViewModel

void SomeItemsControl_DataContextChanged(...)
{
    var collection = (SomeItemsControl.ItemsSource as ObservableCollection);
    if (collection != null)
        collection.CollectionChanged += new CollectionChangedEventHandler(....);
}

答案 1 :(得分:1)

为什么你觉得绑定它很糟糕?

我可能会从视图中绑定到ObservableCollection<T>

在视图中创建DependencyProperty ObservableCollection<T>并在PropertyChanged Callback上订阅OnCollectionChanged事件,然后可以根据{{1}的内容相应地处理动画在视图中。

这样,VM只会使用您提到的这些数字更新集合,并且只要集合以其期望的方式更改,View就会连接到操作

答案 2 :(得分:0)

使用Attached Behaviours将您的viewmodel属性绑定到您需要的任何自定义行为。