静态 ViewModel 与实例化 ViewModel

发布于 2024-11-06 14:50:32 字数 100 浏览 0 评论 0原文

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

I have two views that share one observable collection from certain viewmodel, but with different collection view parameters. What is the correct way of implementing it in MVVM Light? Is there any support for non-static VMs? How can I manage their lifetime and dispose them?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

多情癖 2024-11-13 14:50:32

有!

默认情况下,从 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()); }
    }
}

There is!

By default objects resolved from the SimpleIoc are singletons. To get around this you need to pass a unique identifier as a parameter of the ServiceLocator.GetInstance method.

See below:

We have two properties returning the same viewmodel. One returns a singleton and the other will return a new instance each time.

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()); }
    }
}
鸠书 2024-11-13 14:50:32

Laurent 的一些示例MVVM Light 使用带有静态 ViewModel 实例(类似单例)的 ViewModelLocator。请注意ICleanup 接口。此外,非静态 VM 通常必须在视图的构造函数中进行 MEF 或构造。

Some of Laurent's examples of MVVM Light make use of a ViewModelLocator with static ViewModel instances (singleton-like). Note the ICleanup interface. Also, non-static VM's usually have to be MEFed in or constructed in the View's constructor.

旧故 2024-11-13 14:50:32

对于ViewModels管理通常使用IOC模式。在MVVM Light框架中它是一个SimpleIoc实现。

我更喜欢使用 Ninject - http://www.ninject.org/

For ViewModels management usually use IOC pattern. In MVVM Light framework it is a SimpleIoc implementation.

I prefer to use Ninject - http://www.ninject.org/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文