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