WPF View-ViewModel 松耦合通信

标签 wpf mvvm behavior icommand routedevent

使用 WPF,我的团队正在尝试使用 MVVM 设计模式分离设计和代码。为了实现这一点,我们正在慢慢远离 UserControl 方法,因为它在设计和代码之间存在大量耦合。我们一直在研究结合 ViewModel 类使用控制模板、样式和数据模板。迄今为止,我们已经完成了大量此类工作。

我们遇到的问题与 View 和 ViewModel 之间的通信/通知有关。目前,我们已经“解决”了使用 ICommand 的 View -> Viewmodel 通信问题。即我们创建一个按钮并将其“Command”参数绑定(bind)到 ViewModel 中定义的 RelayCommand 的名称。通过这样做,从 View 引发的按钮单击或其他 Command 事件会调用 ViewModel 中定义的函数。这行得通。

我们遇到的主要问题是让通知以相反的方式运行:即 ViewModel 中的数据更改需要触发 View 中的更新。我们使用 NotifyPropertyChanged 和 DataTriggers 执行此操作,但这并不能满足我们的需求。我们需要的是能够在 Viewmodel 中引发某种事件并让 View 订阅所述事件。我们一直在寻找这个问题的答案,并发现了 RoutedEvents 和 AttachedBehaviors。 RoutedEvents 似乎是解决方案的赢家,但是根据我们的研究,RoutedEvents 不能注册到不从 UIElement 扩展的 ViewModel 上,我们特别尝试将代码与设计分开。

最终,我们要做的是设置一个 ViewModel,可以在其中设置参数或调用函数,从而在 View 上引发事件或行为,然后运行动画。我们确实使用 DataTriggers 进行了这项工作,但是我们试图将我们的动画分离到 ControlTemplate 中,这会引发问题,因为包含 DataTriggers 的 DataTemplate 无法访问 ControlTemplate 中定义的 Storyboard。

有人可以指出我们正确的方向吗?特别是在 ViewModel 中引发事件(不需要扩展 UIElement)并在 View 中订阅此事件并激活 Storyboard。

谢谢

最佳答案

我自己使用 MVVM,如果我想更改屏幕上的某些内容,我使用 INotifyPropertyChanged 接口(interface)。

每当某些 UI 元素必须更改时,就会调用 OnPropertyChanged 事件并更新 UI。

关于WPF View-ViewModel 松耦合通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19859417/

相关文章:

android - 如何以编程方式删除我的 NestedScrollView 的布局行为?

c# - 代码隐藏中的数据绑定(bind)拒绝工作

wpf - 在 Blend 设计时使用 Moq

wpf - 关于 ViewModel

xamarin.forms - 找不到 'MaxLength' 的属性、可绑定(bind)属性或事件,或者值和属性之间的类型不匹配

jquery - 在使用 jQuery 的自动完成功能时防止浏览器的自动建议

wpf - 将 ObservableCollection 绑定(bind)到 WPF ListBox

c# - 为什么我的模拟鼠标点击没有执行任何操作?

wpf - 列表项目选择无法正常工作?

ios - View 模型可以监听其自身属性的变化吗?