我正在使用MVVM模式编写这个主要的内存训练器,方法是在屏幕上对包含2位数字的标签进行动画处理,并要求用户快速输入每个数字的相应助记符。这完全取决于视图如何完成动画,因此将有一些代码。当在 UI 中键入正确的助记符或当数字从屏幕上消失时,将从视图中执行命令以中继已发生这种情况。
在视图模型中,我想定期触发视图动画的新数字(随心所欲(。
实现这一目标的最佳方法是什么?我可以在 ViewModel 中拥有一个 ObservableCollection<>但我想做的不仅仅是绑定到它,我需要在添加和删除数字时在代码隐藏中执行一个方法。
在 ViewModel 中使用简单的 .NET 事件并使用以下方法订阅它们是否符合 MVVM:DataContext.NumberAdd += new NumberAddedEventHandler(....( 还是有其他方法应该这样做?
视图旨在对视图模型进行用户友好的反映。如果要运行特定于视图的逻辑(例如触发动画(,则没有理由不使用代码隐藏来运行它。
只要将 UI 和数据层分开,就可以了。
也就是说,如果您仅从视图层使用它,那么从 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(....);
}
为什么你认为绑定它不好?
我可能会绑定到视图中的ObservableCollection<T>
。
在视图中创建ObservableCollection<T>
DependencyProperty
,并在 PropertyChanged 回调上订阅 OnCollectionChanged
事件,然后该事件可以根据视图中ObservableCollection<T>
的内容相应地处理动画。
这样,VM 只需使用你提到的这些数字更新集合,并且每当集合以所需的方式更改时,视图就会挂接到操作
使用附加行为将视图模型属性绑定到所需的任何自定义行为。