1

我正在使用 MVVM 模式编写这个主要的记忆训练器,方法是在屏幕上为包含 2 位数字的标签设置动画,并要求用户快速输入每个数字的相应助记符。动画是如何完成的完全取决于 View,所以后面会有一些代码。当在 UI 中输入正确的助记符或数字从屏幕上消失时,将从视图中执行命令以传递已发生的情况。

在 ViewModel 中,我想定期触发 View 动画的新数字(随心所欲)。

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

是否符合 MVVM 在 ViewModel 中使用简单的 .NET 事件并通过以下方式订阅它们: DataContext.NumberAdded += new NumberAddedEventHandler(....) 还是我应该这样做的另一种方式?

4

3 回答 3

2

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

只要您将 UI 和数据层分开,就可以了。

也就是说,NumberAdded如果您只从 View 层使用它,那么从 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(....);
}
于 2013-04-30T12:57:22.703 回答
1

为什么你认为绑定它是不好的?

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

在 View 中创建一个DependencyPropertyof ObservableCollection<T>,并在 PropertyChanged Callback 上订阅该OnCollectionChanged事件,然后该事件可以根据ObservableCollection<T>View 中的内容相应地处理动画。

这样,VM 只需使用您提到的这些数字更新集合,并且只要集合以它希望适合的方式发生变化,视图就会连接到操作

于 2013-04-30T12:57:00.503 回答
0

使用附加行为将您的视图模型属性绑定到您需要的任何自定义行为。

于 2013-04-30T12:59:27.890 回答