I'm trying to do some clean-up when my WPF app is closed. I know the ViewModelLocator.Cleanup() is getting called when the app shuts down, but I need to call the Cleanup method I have defined in my AvigilonViewModel class. The creation of an instance of AvigilonViewModel is not something I recognise, and I cant figure out how to use it.
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'
*/
}
}
}
This similar question seems relevant but I get more erros when I try to implement it (I will post errors if required)... How to force Cleanup() for all my ViewModels
UPDATE - FOR ANSWER FROM 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 */
}
}
}
But what is CleanUp
?
Aviglion.Cleanup()
in your code will call getter of Aviglion
which is invalid call as the error message suggested, because the getter is not static and being called from a static method. More importantly, I believe that isn't what you meant to do.
Answer to the question you linked suggests that the way is by sending a clean up message to your AvigilonViewModel
:
public static void Cleanup()
{
Messenger.Default.Send<CleanUp>(new CleanUp());
}
..and make AvigilonViewModel
listen to that particular message so it can responds the message by cleaning it self, for example :
public class AvigilonViewModel : ViewModelBase
{
public AvigilonViewModel()
{
Messenger.Default.Register<CleanUp>(this,CallCleanUp);
}
private void CallCleanUp()
{
//do the actual cleaning up here
Cleanup();
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.