如何使用unity容器区分多个视图/视图模型对

时间:2012-04-02 09:13:51

标签: c# wpf mvvm unity-container viewmodel

在我的应用程序中,我使用具有相同view-viewmodel对的多个窗口。我也使用统一容器。

我最近添加了一个翻译模块,由Grant Frisken使用RESX文件进行WPF本地化(代码项目)。现在,如果我更改语言,则再次执行viewmodel的构造函数,并且不存储任何变量。视图仍将其datacontext设置为该视图模型的某个实例,但所有视图都使用相同的视图模型。

目前我认为我使用了错误的方法,但什么是更好的解决方案?

打开一个新窗口:

    var openWindow = new MyView();
    openWindow.Show();

在我的xaml中:

    DataContext="{Binding MyViewModel, Source={StaticResource Locator}}" 

在我的viewmodel中

    private IMyWindowData _data;

    [InjectionConstructor]
    protected SettingsBaseViewModel(IMyWindowData data)
    {                        
        _data = windows;
    }

这一切都很好,直到我实现了新的语言模块。当我选择更改语言时,变量_data消失了。然后,注入构造函数具有其他窗口的数据,这些窗口也是相同的类型。

我拼命搜索互联网,但没有找到答案。

1 个答案:

答案 0 :(得分:2)

我找到了解决问题的方法。在阅读了Laurent Bugnion his post之后。在我的项目中,我使用他的mvvm light框架和viewmodelLocater,可以无限期地实例化。

    DataContext = ((ViewModelLocator)Application.Current.Resources["Locator"])
    .WindowData(Guid.NewGuid);

放置在每个View的后端。关闭View后,垃圾收集器将自动收集ViewModel。

    public DataModel WindowData(Guid uniqueId)
    {
        return BootStrapper.Container.Resolve<DataModel>(uniqueId.ToString());
    }

每次创建不同的名称时,unity容器都会实例化一个新对象。