当我的WPF应用关闭时,我正在尝试进行一些清理工作。我知道ViewModelLocator.Cleanup()在app关闭时被调用,但是我需要调用我在AvigilonViewModel类中定义的Cleanup方法。创建一个AvigilonViewModel实例并不是我认识的,我无法弄清楚如何使用它。
... ViewModelLocator.cs
namespace Module.Config.ViewModel
{
public class ViewModelLocator
{
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
if (ViewModelBase.IsInDesignModeStatic)
{
//SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
}
else
{
//SimpleIoc.Default.Register<IDataService, DataService>();
}
SimpleIoc.Default.Register<AppState>();
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<AvigilonViewModel>();
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
"CA1822:MarkMembersAsStatic",
Justification = "This non-static member is needed for data binding purposes.")]
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
"CA1822:MarkMembersAsStatic",
Justification = "This non-static member is needed for data binding purposes.")]
public AvigilonViewModel Avigilon
{
get
{
return ServiceLocator.Current.GetInstance<AvigilonViewModel>();
}
}
/// <summary>
/// Cleans up all the resources.
/// </summary>
public static void Cleanup()
{
Avigilon.Cleanup();
/* I get error: An object reference is required for
the non-static field, method, or property
'Module.Config.ViewModel.ViewModelLocator.Avigilon.get'
*/
}
}
}
这个类似的问题看似相关,但是当我尝试实现它时,我会得到更多的错误(如果需要,我会发布错误)...... How to force Cleanup() for all my ViewModels
更新 - 来自har07的答案
... ViewModelLocator.cs
namespace Module.Config.ViewModel
{
public class ViewModelLocator
{
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
if (ViewModelBase.IsInDesignModeStatic)
{
//SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
}
else
{
//SimpleIoc.Default.Register<IDataService, DataService>();
}
SimpleIoc.Default.Register<AppState>();
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<AvigilonViewModel>();
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
"CA1822:MarkMembersAsStatic",
Justification = "This non-static member is needed for data binding purposes.")]
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
"CA1822:MarkMembersAsStatic",
Justification = "This non-static member is needed for data binding purposes.")]
public AvigilonViewModel Avigilon
{
get
{
return ServiceLocator.Current.GetInstance<AvigilonViewModel>();
}
}
public static void Cleanup()
{
Messenger.Default.Send<CleanUp>(new CleanUp());
}
}
}
... AvigilonViewModel.cs
namespace Module.Config.ViewModel.Modules
{
public class AvigilonViewModel : ViewModelBase
{
. . .
public AvigilonViewModel(AppState state)
{
Messenger.Default.Register<CleanUp>(this, CallCleanUp);
. . . .
}
private void CallCleanUp
{
/* do actual cleanup */
}
}
}
但是CleanUp
是什么?
答案 0 :(得分:0)
Aviglion.Cleanup()
将调用Aviglion
的getter作为错误消息建议的无效调用,因为getter不是静态的并且是从静态方法调用的。更重要的是,我认为这不是你的意思。
对您关联的问题的回答表明,方法是向您的AvigilonViewModel
发送清理邮件:
public static void Cleanup()
{
Messenger.Default.Send<CleanUp>(new CleanUp());
}
..并使AvigilonViewModel
听取该特定消息,以便它可以通过自我清理来响应消息,例如:
public class AvigilonViewModel : ViewModelBase
{
public AvigilonViewModel()
{
Messenger.Default.Register<CleanUp>(this,CallCleanUp);
}
private void CallCleanUp()
{
//do the actual cleaning up here
Cleanup();
}
}