静态视图模型与实例化视图模型

本文关键字:视图 模型 实例化 静态 | 更新日期: 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/