我有两个视图,它们从某个视图模型共享一个可观察集合,但具有不同的集合视图参数。在MVVM Light中实现它的正确方法是什么?是否支持非静态虚拟机?我如何管理他们的生命并处理它们?
答案 0 :(得分:1)
有!
默认情况下,从SimpleIoc解析的对象是单例。要解决此问题,您需要传递唯一标识符作为ServiceLocator.GetInstance方法的参数。
见下文:
我们有两个属性返回相同的viewmodel。一个返回一个单例,另一个返回一个新实例。
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()); }
}
}
答案 1 :(得分:0)
一些Laurent的examples of MVVM Light使用ViewModelLocator和静态ViewModel实例(类似singleton)。请注意ICleanup
界面。此外,非静态VM通常必须在View的构造函数中进行MEFed或构造。
答案 2 :(得分:0)
对于ViewModels管理,通常使用IOC模式。在MVVM Light框架中,它是一个SimpleIoc实现。
我更喜欢使用Ninject - http://www.ninject.org/