Wpf 订阅ViewModel';MVVM中视图中的s.NET事件?

Wpf 订阅ViewModel';MVVM中视图中的s.NET事件?,wpf,events,mvvm,viewmodel,Wpf,Events,Mvvm,Viewmodel,我使用MVVM模式编写本文,通过在屏幕上设置包含2位数字的标签动画,并要求用户为每个数字快速键入相应的助记符。这完全取决于如何完成动画的视图,因此将有一些代码用于此。当在UI中键入正确的助记符时,或者当数字从屏幕上消失时,将从视图中执行命令,以转告发生了这种情况 在ViewModel中,我希望周期性地发出视图动画所用的新数字(根据需要) 实现这一目标的最佳方式是什么?我可以在ViewModel中有一个ObservableCollection,但我想做的不仅仅是绑定到它,当添加和删除数字时,我需要

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

在ViewModel中,我希望周期性地发出视图动画所用的新数字(根据需要)

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


在ViewModel中使用简单的.NET事件并使用:DataContext.NumberDedded+=new NumberDedEventHandler(..)订阅它们是否符合MVVM的规定,或者我应该用其他方式来执行吗?

为什么您认为绑定到它是不好的

我可能会从视图绑定到
可观测集合

在视图中创建
ObservableCollection
DependencyProperty
,并在PropertyChanged回调上订阅
OnCollectionChanged
事件,然后该事件可以根据视图中
ObservableCollection
的内容相应地处理动画


通过这种方式,虚拟机只需使用您提到的这些数字更新集合,并且每当集合以其所需的方式更改时,视图就会连接到操作。如果要运行视图特定的逻辑(例如触发动画),则没有理由不使用代码隐藏来运行它

如果您将UI层和数据层分开,就可以了

也就是说,如果仅从视图层使用,那么从ViewModel提供一个编号为的事件对我来说没有意义。这会把你的层次搞混

相反,我只需使用常规的
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(....);
}

用于将viewmodel属性绑定到所需的任何自定义行为。

此外,我相信您甚至不需要事件。您应该能够绑定到视图中的“当前挑战”集合,使用
DataTemplate
渲染每个挑战,并使用触发器处理动画。不需要任何事件。我认为这里唯一优先考虑的事情是,正如我提到的,有一个DP,而不是直接转换DataContext并订阅数字集合。这样,如果将来删除了绑定或切换了ViewModel,您就不会出现异常,而且只要查看xaml,您就知道该视图期望从其DataContext中获得依赖关系。同样,这只是一种偏好,可以忽略。只是提供了一个小小的未来证明,让视图可以在不同的虚拟机上重用s@Viv是的,DP肯定是解决此问题的另一个好方法,尤其是当整个集合没有绑定到UI中的某个位置时。:)是的,对于我来说,可以灵活地将此视图附加到另一个ViewModel,而无需做太多更改,而可能的绑定属性名称似乎胜过依赖项订阅:)将使用Viv的方法。我正在使用画布设置数字的动画,因此标签将存储在画布1中。子对象和两个可观察集合,一个在视图中,另一个绑定到ViewModel中。呸!终于把它连接起来了,经过长时间的编码中断,我已经生锈了。我喜欢这样做。