我何时在控件中分离事件处理程序?

时间:2014-02-11 20:19:15

标签: c# wpf

所以我有一个控件,其面板将这些事件附加到面板的初始化事件中:

  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并在面板中执行操作更合理,尽管这样做的好处是不需要我订阅/取消订阅事件。但缺点是我必须考虑属性事件切换的合理名称。

1 个答案:

答案 0 :(得分:1)

对问题#1的回答是啊,有点,卸载事件应该用于释放资源。

但是,如果事件处理程序仅位于控件内,并且您知道在运行时期间不会在VisualTree中不断添加或删除控件,那么您可以让垃圾收集器为您完成工作。意味着一旦没有人将实例保存到你的控制中,垃圾收集器就会收集所有这些。

回答问题#2:阅读伯纳德所说的话。 View和ViewModel之间的通信不应该存在。但是,ViewModel可以与View通信,每次设置Binding或使用INotifyPropertyChanged接口时都是如此。