在MVVM方式中,我有一个初始窗口打开(MainView),其DataContext(即其viewmodel)从代码隐藏中初始化:
XAML:
<Window x:Class="Nova5.UI.Views.MainView" ..............
C#背后的代码:
public partial class MainView : Window
{
private MainViewModel vm = new MainViewModel(new WPFMessageBoxService());
public MainView()
{
InitializeComponent();
this.Loaded += (s, e) => { this.DataContext = this.vm; };
}
}
从那时起,我使用DialogService从UserControls打开其他窗口:
XAML:
<Window x:Class="Nova5.UI.Views.WindowDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WindowDialog"
WindowStyle="SingleBorderWindow"
WindowStartupLocation="Manual" SizeToContent="WidthAndHeight">
<ContentPresenter x:Name="DialogPresenter" Content="{Binding .}"/>
</Window>
ViewModel创建WindowDialog和关联的viewmodel并打开窗口。
一切都很好。
现在问题。可以说我有十个用户控件。 DialogService可以显示每个UserControl。这些UserControl中的每一个都可以打开其他UserControl。
我想要做的是让MainWindow打开UserControl_1。然后让UserControl_1打开UserControl_2。然后UserControl_1需要关闭,打开UserControl_2。当然,UserControl_2可以打开UserControl_3,之后UserControl_2消失,只留下MainWindow和UserControl_3。简而言之,每个启动的UserControl都需要独立于创建它的控件。
我希望这是可以理解的。
如何做到这一点?感谢您的任何想法或帮助。
答案 0 :(得分:1)
通常,您需要在Dependency Injection
实现Inversion of Control
模式。 Unity
是与WPF一起使用的IoC容器的一个很好的例子(并建议作为Prism的一部分)。
依赖注入容器本质上是一个内存容器,用于服务对象之类的项目,或者基于您配置的接口(通过代码或配置XML或其他方式)提供实现类,并在运行时解析。
各种Window / Usercontrol对象的ViewModels
将在构造时注入DialogService
对象的引用。 DialogService
对象可能正在显示相关对话框的列表,并且可以根据您编入其中的调用/逻辑,根据需要协调显示/关闭Windows。
您还可以将DialogService
编码为Singleton模式并获得类似的结果,因为Unity风格的复合应用程序中使用的许多内存中服务层实现本质上是通过UnityContainer
强制执行的单例。