是否可以从 MVVM 中的视图订阅视图模型的 .NET 事件?



我正在使用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 只需使用你提到的这些数字更新集合,并且每当集合以所需的方式更改时,视图就会挂接到操作

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

相关内容

  • 没有找到相关文章

最新更新