在我的应用程序中,我使用具有相同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消失了。然后,注入构造函数具有其他窗口的数据,这些窗口也是相同的类型。
我拼命搜索互联网,但没有找到答案。
答案 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容器都会实例化一个新对象。