静态ViewModels与实例化ViewModels

时间:2011-05-13 10:39:37

标签: c# wpf mvvm viewmodel mvvm-light

我有两个视图,它们从某个视图模型共享一个可观察集合,但具有不同的集合视图参数。在MVVM Light中实现它的正确方法是什么?是否支持非静态虚拟机?我如何管理他们的生命并处理它们?

3 个答案:

答案 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/