一句话总结:在 Silverlight2 的 UserControl 的构造函数中创建的 unhook 事件处理程序的最佳实践是什么?
背景: 我目前正在 Silverlight2 中构建一个业务线应用程序。由于 Silverlight 是一个浏览器插件,因此没有 Window 的概念 - 一切都在 UserControls 中完成。我在应用程序中处理不同“表单”的方式是拥有一个包含 Viewbox 的顶级用户控件。为了显示不同的表单,我将 Viewbox 的 Child 属性设置为不同的 UserControl。我的应用程序有一个单独的 PageManager 类,调用它来打开和关闭表单。表单 (UserControls) 存储在堆栈中。打开一个表单将它放在堆栈的顶部,关闭它会将它从堆栈中删除并显示它下面的一个。
我正在尝试遵循 Model-View-ViewModel 模式。在每个表单(从 UserControl 派生)中,我都有一个 ViewModel 来管理视图的所有数据。ViewModel 公开事件,以便在加载和保存等操作完成时通知 UI。
在我的表单中,在获得 ViewModel 之后,我订阅了构造函数中的事件
public partial class MyPage : UserControl
{
public MyViewModel ViewModel{get; set;}
// other constructors, which create the viewmodel and call the constructor below.
public MyPage(MyViewModel viewModel)
{
InitializeComponent();
ViewModel = viewModel;
this.LayoutRoot.DataContext = this.ViewModel;
// subscribe to event so we can do stuff
this.ViewModel.LoadCompleted += new MyViewModel.LoadCompletedEventHandler(ViewModel_LoadCompleted);
}
我的问题是:既然我已经订阅了这个事件,我什么时候删除处理程序?我是创建一个析构函数并在那里执行它,还是创建一个先有鸡还是先有蛋的情况,即垃圾收集器在所有引用(即:事件处理程序)都消失之前不会销毁对象?我是否创建了表单必须实现的接口,该接口指定了在 PageManager 关闭表单时调用的 UnhookEvents 函数?
编辑:感谢您的回复。ViewModel持续时间长于表单(UserControl)的情况呢?我的应用程序的一部分允许用户创建相当复杂的结构,但在 95% 的情况下它要简单得多。我所做的是创建 2 个使用相同 ViewModel 的表单。用户可以开始填写简单的表单,然后切换到高级模式,这将创建一个新表单,并将 ViewModel 传递给它。
在简单的设置表单中:
private void AdvancedSessionSetupButton_Click(object sender, RoutedEventArgs e)
{
PageManager.GetPageManager().Close(this);
PageManager.GetPageManager().Open(new CreateSessionPage(this.ViewModel), "Create Session");
}
在高级设置表单中:
private void BasicSessionSetupButton_Click(object sender, RoutedEventArgs e)
{
PageManager.GetPageManager().Close(this);
PageManager.GetPageManager().Open(new CreateBasicSessionPage(this.ViewModel), "Create Session");
}
在 PageManager.Close 之后,唯一引用表单的是 ViewModel 中的事件。我想这就是我应该解开它们的地方。