何时分离控件中的事件处理程序



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

  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.何时应分离事件?在面板中这样做是否合适?

问题2.使用事件从视图模型到视图进行通信是否合适?这似乎比创建属性布尔值并根据属性更改事件在面板中执行操作更合理,尽管这样做的好处是不需要我订阅/取消订阅事件。 但缺点是我必须为属性事件切换考虑合理的名称。

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

但是,如果事件处理程序仅存在于控件内部,并且您知道在运行时不会不断在 VisualTree 中添加或删除控件,则可以让垃圾回收器为您完成这项工作。这意味着一旦没有人将实例控制在您的控制之下,垃圾回收器无论如何都会收集所有实例。

回答问题#2:阅读伯纳德所说的话。视图和视图模型之间的通信不应存在。但是,视图模型可能会与视图通信,每次设置绑定或使用 INotifyPropertyChanged 接口时都是这种情况。

最新更新