【问题标题】:Unload childwindow on close (silverlight mvvm)关闭时卸载子窗口(silverlight mvvm)
【发布时间】:2011-07-26 17:41:24
【问题描述】:

如何确保我的子窗口在关闭时被卸载?

我正在从我的视图模型中打开子窗口,但在它关闭后,它仍然会触发组合框上的 selectionchanged 等事件。

子窗口使用与调用它的视图模型相同的视图模型,所以我想这解释了为什么会触发事件。 itemssource 仍然有效。

但是当它关​​闭时,我想永远“处置”子窗口。

我尝试添加这样的 Closed 处理程序(默认视图代码在后面):

    private void OnLaunchEditItem(ItemMessage msg)
    {
        var editWnd = new EditItemWindow();
        editWnd.Closed += new EventHandler(editWnd_Closed);
        editWnd.Show();
    }

    void editWnd_Closed(object sender, EventArgs e)
    {
        sender = null;
    }

没有成功..

所以我现在要做的是从子窗口控件中删除 itemssource,在我看来这不是解决问题的理想方法。必须有可能在关闭时从内存中全部处理掉? (子窗口“查看”代码隐藏)

    private void OKButton_Click(object sender, RoutedEventArgs e)
    {
        this.DialogResult = true;
        combobox1.ItemsSource = null;
        combobox2.ItemsSource = null;
    }

    private void CancelButton_Click(object sender, RoutedEventArgs e)
    {
        this.DialogResult = false;
        combobox1.ItemsSource = null;
        combobox2.ItemsSource = null;
    }

【问题讨论】:

标签: silverlight mvvm-light childwindow


【解决方案1】:

消息传递存在一个已知问题,它在消息传递者和消息接收者之间引入了硬链接。因此,如果您使用消息传递,您必须确保调用 Messenger.Unregister 方法。换句话说,当您调用 Register 处理消息时,请确保您也调用 Unregister

所以在您看来,您必须注册Unloaded 活动;然后你打电话给Messenger.Unregiser(this); 这是你的观点。

在 ViewModels 中,您必须确保调用 Cleanup 方法以将 ViewModel 取消注册为消息接收者。

另见:

MVVM Light Listener not releasing / deterministic finalization for registered object?MVVM Light Messenger executing multiple times

Laurent 意识到了这个问题,但 - 到目前为止 - 没有解决方案。

【讨论】:

    【解决方案2】:
    1. 在视图之间共享 ViewModel 会导致这样的问题。这就是为什么很少这样做的原因。
    2. ViewModel 通常不应该关注导航,因为在理想情况下,它甚至不应该知道它绑定到哪种视图。这包括生成子视图 (ChildWindows)。

    我会向您推荐两项更改。第一个是为您的对话框创建一个专用的视图模型。其次,通过将导航委托给控制器,将导航与视图模型分离。 MVVM 中的控制器通常是一个单例对象,其全部目的是打开窗口、对话框等。这可以使用事件聚合器模式以一种非常优雅的方式实现。

    【讨论】:

    • viewmodel 不“知道”子窗口,因为它发送一条 mvvmlight 消息,该消息被默认视图拾取。正是在这个视图中,上面的代码取自(打开子窗口)。上面的所有代码都来自视图代码隐藏,而不是视图模型。但是默认视图和子窗口“视图”都链接到同一个视图模型以共享“selecteditem”。
    • 致 Oliver Weichhold:根据经验......这样的行为通常表明消息传递出错了,即没有取消注册消息处理程序。这是 MVVM-Light 的已知行为。对于 Oliver Weichhold 和 @Kman,请参阅我的回答。
    猜你喜欢
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多