最近我被要求将一个相当大的桌面应用程序转换为可以添加到其他表单/窗口的单个控件。在桌面版本中,它包含一个主窗口,该主窗口会生成其他窗口。
有一个ViewModelLocator类,该类可初始化窗口的各种对象和视图模型,并将适当的对象注入到这些视图模型的构造函数中。这是ViewModelLocator和MainWindow.xaml中的示例:
public class ViewModelLocator
{
CustomMap Map = new CustomMap();
ObservableCollection<Styles> MapStyles = new ObservableCollection<Styles>();
public MainViewModel MainViewModel
{
get
{
if (_mainViewModel == null)
{
_mainViewModel = new MainViewModel(Map, Styles);
}
return _mainViewModel;
}
}
}
这是主窗口设置其数据上下文的方式:
<Window x:Class="DesktopApp.MainWindow"
DataContext="{Binding Path=MainViewModel, Source={StaticResource ViewModelLocator}}"
</Window>
这是在App.xaml中,用于将ViewModelLocator添加为资源:
<Application.Resources>
<vm:ViewModelLocator x:Key="ViewModelLocator" />
</Application.Resources>
还有其他一些以相同方式设置的视图模型和窗口。通过使定位器将这些对象注入到视图模型的构造函数中,它们都共享在viewmodellocator中启动的各种对象。
主要问题是,当我将此应用程序转换为用户控件时,我必须摆脱App.xaml,除非我将其中的所有内容都设为静态或使其成为单例版本,否则它也将删除viewmodellocator。
初始化这些视图模型并在它们之间共享数据的最佳方法是什么?因为现在是入口点,我是否必须将所有内容都放在MainWindow的代码(现在为usercontrol)中?
我希望尽可能使它与MVVM模式保持一致。