静态视图模型与实例化视图模型
本文关键字:视图 模型 实例化 静态 | 更新日期: 2023-09-27 17:56:25
我有两个视图,它们共享来自某个视图模型的一个可观察集合,但具有不同的集合视图参数。在 MVVM Light 中实现它的正确方法是什么?是否支持非静态 VM?我如何管理它们的生命周期并处置它们?
有!
默认情况下,从 SimpleIoc 解析的对象是单例。 若要解决此问题,需要传递唯一标识符作为 ServiceLocator.GetInstance 方法的参数。
见下文:
我们有两个属性返回相同的视图模型。 一个返回一个单一实例,另一个每次都会返回一个新实例。
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<MainViewModel>();
SimpleIoc.Default.Register<SecondViewModel>();
}
public MainViewModel MainAsSingleton
{
get { return ServiceLocator.Current.GetInstance<MainViewModel>(); }
}
public MainViewModel MainAsDiffrentInstanceEachTime
{
get { return ServiceLocator.Current.GetInstance<MainViewModel>(Guid.NewGuid().ToString()); }
}
}
Laurent 的一些 MVVM Light 示例使用了具有静态 ViewModel 实例(类似单例)的 ViewModelLocator 。 请注意ICleanup
界面。 此外,非静态 VM 通常必须在视图的构造函数中进行 MEF 处理或在构造函数中构造。
对于视图模型,管理通常使用 IOC 模式。在MVVM Light框架中,它是一个SimpleIoc实现。
我更喜欢使用Ninject - http://www.ninject.org/