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

C# 静态视图模型与实例化视图模型,c#,wpf,mvvm,viewmodel,mvvm-light,C#,Wpf,Mvvm,Viewmodel,Mvvm Light,我有两个视图,它们共享某个viewmodel中的一个可观察集合,但具有不同的集合视图参数。在MVVM环境下实现它的正确方法是什么?是否支持非静态虚拟机?我如何管理它们的生命周期并对其进行处置?Laurent的一些产品将ViewModelLocator与静态ViewModel实例(类似于单例)结合使用。注意ICleanup界面。此外,非静态VM通常必须在视图的构造函数中进行MEFed或构造。对于视图模型管理,通常使用IOC模式。在MVVM轻型框架中,它是一个SimpleIoc实现 我更喜欢使用Ni

我有两个视图,它们共享某个viewmodel中的一个可观察集合,但具有不同的集合视图参数。在MVVM环境下实现它的正确方法是什么?是否支持非静态虚拟机?我如何管理它们的生命周期并对其进行处置?

Laurent的一些产品将ViewModelLocator与静态ViewModel实例(类似于单例)结合使用。注意
ICleanup
界面。此外,非静态VM通常必须在视图的构造函数中进行MEFed或构造。

对于视图模型管理,通常使用IOC模式。在MVVM轻型框架中,它是一个SimpleIoc实现

我更喜欢使用Ninject-

默认情况下,从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()); }
    }
}
类ViewModelLocator
{
静态ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(()=>SimpleIoc.Default);
if(ViewModelBase.IsIndesignatic)
{
SimpleIoc.Default.Register();
}
其他的
{
SimpleIoc.Default.Register();
}
SimpleIoc.Default.Register();
SimpleIoc.Default.Register();
}
公共主视图模型MainAsSingleton
{
get{return ServiceLocator.Current.GetInstance();}
}
public Main视图模型MainAsDifferentinstanceEachTime
{
get{return ServiceLocator.Current.GetInstance(Guid.NewGuid().ToString());}
}
}

您使用的是Unity或MEF等DI容器吗?不,我使用的是基本MVVM灯光模板。