Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 静态资源视图模型的处理_Wpf_Mvvm_Mvvm Light - Fatal编程技术网

Wpf 静态资源视图模型的处理

Wpf 静态资源视图模型的处理,wpf,mvvm,mvvm-light,Wpf,Mvvm,Mvvm Light,我有一个简单的视图模型 public class TestViewModel : ViewModelBase, IDisposable { public TestViewModel() { Messenger.Default.Register<string>(this, MessageHandling); } public void MessageHandling(string message) {

我有一个简单的视图模型

    public class TestViewModel : ViewModelBase, IDisposable
    {

    public TestViewModel()
    {
        Messenger.Default.Register<string>(this, MessageHandling);
    }

    public void MessageHandling(string message)
    {
        System.Windows.MessageBox.Show(message);
    }
    public override void Cleanup()
    {
        Messenger.Default.Unregister(this);
        base.Cleanup();
    }
    }
公共类TestViewModel:ViewModelBase,IDisposable { 公共TestViewModel() { Messenger.Default.Register(这是MessageHandling); } 公共无效消息处理(字符串消息) { System.Windows.MessageBox.Show(message); } 公共覆盖无效清除() { Messenger.Default.Unregister(此选项); base.Cleanup(); } } 我在XAML中使用它,如下所示:

   <Window.Resources>
    <ResourceDictionary>
        <vm:TestViewModel x:Key="ViewModel"></vm:TestViewModel>
    </ResourceDictionary>
   </Window.Resources>
   <Grid DataContext="{Binding Source={StaticResource ViewModel}}">
   </Grid>

有人能帮我们处理这个ViewModel吗?我的意思是,我应该订阅哪个事件来调用VM方法清理?因为如果我不进行清理,ViewModel将保留在内存中,并且仍然处理消息。 我希望我解释得恰当:)


提前感谢

首先,您需要处理它的时候,这取决于您自己。你没说清楚。我首先认为你的意思是“当应用程序关闭时”,然后我会使用事件。但是我被你的陈述给搞错了

因为如果不进行清理,ViewModel将保留在内存中,并且 仍然处理消息。我希望我解释得恰当

只有在您希望处置但仍需要运行应用程序时才能发生什么情况。如果应用程序关闭,内存中就不会有任何内容,也不会再处理任何消息。但这仍然是一个良好的做法,不依赖于此


因此,如果您的意思是“当应用程序关闭时”,这就是您的答案。

这里有一个解释,解释了为什么即使您取消注册,Messenger仍然会导致强引用,以及解决方法

发生卸载时,FrameworkElement(“视图”)可以调用ViewModel中的清理:


您似乎正在使用
MVVM Light Toolkit
,对吗?@Paul Michalik正确,但如果这是您的下一个问题,我不会使用ViewModelLocator:)好的,我担心我没有很好地解释我的需要。例如,此窗口是我的应用程序中的某个窗口/控件,我打开/使用它来使用VM执行一些工作,然后我关闭此窗口并打开另一个窗口用于其他目的,但使用相同的viewmodel类(不同的实例),但我的VM保持活动状态,因为Messenger类有一个用于接收消息的引用。我想要/需要的是当我的窗口/控件不再被使用时调用VM的清理方法的事件。注意:卸载事件不好(使用选项卡并在原因清理之间切换),如果它是一个窗口,则您可以使用该事件。是的,对于窗口很好,那么控件呢?那么您只能选择使用加载和卸载,但这可能会被多次调用,并且不是控件“关闭”的明确指示但这就是所有的一切。@Dowhile在您假设一切都由GC管理并将为您清理,并且应用程序正在关闭之前。在这种情况下,如果你真的需要手动清理一些东西怎么办?如果使用ElementHost时没有WPF窗口呢?是的,我已经读过了,这很好,我试图找到的是何时在我的ViewModel上调用Cleanup谢谢,但我已经尝试了这种方法卸载事件,这对大多数情况都很好,但我需要另一种方法,因为卸载事件发生在从可视树中删除窗口/控件时,但不一定关闭。例如选项卡控件,在选项卡之间切换会导致卸载事件和我的VM从消息中注销,但这不是我想要的行为,因为我希望VM在释放控件之前仍然附加到消息。我是否解释了我的问题?您可以通过使用不同的TabControl来防止切换选项卡时出现卸载行为。和其他解决方法@colinsith谢谢你的帮助,它没有直接解决我的问题,而是给了我解决问题的方法谢谢again@Miran您想分享您的解决方案吗?