我正在使用MVVM模式编写此major memory trainer,方法是在屏幕上设置包含2位数字的标签,并要求用户快速输入每个数字的相应助记符。这完全取决于View如何完成动画,因此会有一些代码。当在UI中输入正确的助记符或者当数字从屏幕上消失时,将从视图执行命令以继续发生这种情况。
在ViewModel中,我想定期触发查看动画的新数字(随意)。
实现这一目标的最佳方法是什么?我可以有一个ObservableCollection<>在ViewModel中我想做的不仅仅是绑定到它,我需要在添加和删除数字时在代码中执行一个方法。
是否符合MVVM在ViewModel中使用简单的.NET事件并使用以下内容订阅它们:DataContext.NumberAdded + = new NumberAddedEventHandler(....)或者我应该采用另一种方式吗?
答案 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属性绑定到您需要的任何自定义行为。