所以我有一个控件,其面板将这些事件附加到面板的初始化事件中:
gvvm = DataContext as GraphViewerViewModel;
gvvm.ZoomToFitEvent += new EventHandler(_GraphViewerViewModel_ZoomToFitEvent);
gvvm.ZoomInEvent += new EventHandler(_GraphViewerViewModel_ZoomInEvent);
gvvm.ZoomOutEvent += new EventHandler(_GraphViewerViewModel_ZoomOutEvent);
gvvm.CloseVCDEvent += new EventHandler(gvvm_CloseVCDEvent);
gvvm.LoadVCDEvent += new EventHandler(gvvm_LoadVCDEvent);
gvvm.ScrollToTimeEvent += new EventHandler<GraphViewerViewModel.ScrollToTimeEventArgs>(gvvm_ScrollToTimeEvent);
问题1.我应该何时分开事件?是否适合在panel.unloaded中这样做?
问题2.使用事件从视图模型到视图进行通信是否合适?它似乎比基于propertychanged事件创建属性bool并在面板中执行操作更合理,尽管这样做的好处是不需要我订阅/取消订阅事件。但缺点是我必须考虑属性事件切换的合理名称。
答案 0 :(得分:1)
对问题#1的回答是啊,有点,卸载事件应该用于释放资源。
但是,如果事件处理程序仅位于控件内,并且您知道在运行时期间不会在VisualTree中不断添加或删除控件,那么您可以让垃圾收集器为您完成工作。意味着一旦没有人将实例保存到你的控制中,垃圾收集器就会收集所有这些。
回答问题#2:阅读伯纳德所说的话。 View和ViewModel之间的通信不应该存在。但是,ViewModel可以与View通信,每次设置Binding或使用INotifyPropertyChanged接口时都是如此。