通过使用WPF,我的团队正在尝试使用MVVM设计模式来分离设计和代码。为了实现这一点,我们正在慢慢远离UserControl方法,因为这种方法在设计和代码之间有大量的耦合。我们一直在研究将控件模板、样式和DataTemplates与ViewModel类结合使用。到目前为止,我们已经得到了大量这样的工作。
我们遇到的问题与View和ViewModel之间的通信/通知有关。目前,我们已经使用ICommand“解决”了View -> Viewmodel的通信问题。也就是说,我们创建一个按钮,并将它的‘"Command“参数绑定到ViewModel中定义的RelayCommand的名称。通过这样做,从视图引发的按钮单击或其他命令事件将调用ViewModel中定义的函数。这是可行的。
我们的主要问题是让通知以相反的方式运行:即,ViewModel中的数据更改需要触发视图中的更新。我们使用NotifyPropertyChanged和DataTriggers来实现这一点,但是这并不能满足我们的需求。我们需要的是能够在Viewmodel中引发某种类型的事件,并让View订阅所述事件。我们一直在寻找这个问题的答案,并且已经找到了RoutedEvents和AttachedBehaviors的相关信息。RoutedEvents似乎是一个解决方案的赢家,然而从我们的研究来看,RoutedEvents不能注册到不是从UIElement扩展的ViewModel上,我们特别努力将我们的代码与设计分开。
最终,我们要做的是设置一个ViewModel,在其中可以设置一个参数,或者调用一个函数,在视图上引发一个事件或行为,然后运行一个动画。我们确实使用了DataTriggers,但是我们试图将动画分离到ControlTemplate中,这会引发问题,因为包含DataTriggers的DataTemplate无法访问ControlTemplate中定义的故事板。
有没有人能给我们指个方向?具体地说,就是在ViewModel中引发事件(不需要扩展UIElement),并在视图中订阅此事件并激活故事板。
谢谢
发布于 2013-11-08 20:51:55
我自己使用MVVM,如果我想在屏幕上改变一些东西,我会使用INotifyPropertyChanged界面。
每当需要更改某些UI元素时,都会调用OnPropertyChanged事件并更新UI。
发布于 2013-11-08 20:51:14
最好的方法是创建一个基本视图,一旦设置了该属性,它就会自动订阅VM上的INotifyPropertyChanged (不要忘记取消订阅!)。远离视图模型上的RoutedEvents (或任何与UI相关的事件)。他们应该只实现INotifyPropertyChanged。
Catel为您提供了一个开箱即用的解决方案来解决这些问题:
https://catelproject.atlassian.net/wiki/display/CTL/Mapping+properties+from+view+to+view+model
如果您不能使用Catel,只需将需要的部分复制/粘贴到您自己的框架中即可。但是,不要浪费时间一遍又一遍地重复发明轮子;-)
发布于 2013-11-08 20:59:48
您还可以使用中介模式从视图模型中启动动画。只需从视图模型发送一条消息,并在视图上订阅该类型的消息。
https://stackoverflow.com/questions/19859417
复制相似问题