没有viewmodel重置的WPF / MVVM窗口服务

时间:2018-02-24 17:36:46

标签: wpf mvvm

我想从我的视图模型中删除视图的创建

我写了WinodwsService类来创建一个新窗口:

public class WindowService : IWindowService
{
    public void ShowWindow(object viewModel)
    {
        //var win = new DXWindowCloasable(viewModel);
        var win = new DXWindow();
        win.Content = viewModel;
        win.DataContext = viewModel;
        win.ShowDialog();

    }
}

在视图模型中,我调用方法:

var vm = new PolaPrzewoznikowViewModel(konf);
IWindowService wnf = new WindowService(); // this is only for test
wnf.ShowWindow(vm);

在UserControl中,我定义了视图模型类型:

<UserControl.DataContext>
    <local:PolaPrzewoznikowViewModel />
</UserControl.DataContext>

当我有这个时,我可以向下钻取(CTRL + B)命令,并在我投影视图时使用代码完成 - 这非常有帮助。

但......当我使用时     win.ShowDialog();新视图模型已创建。并且显示的视图具有不带参数的视图模型(默认构造函数)。

如何使用窗口服务并在视图中保留已定义的UserControl.DataContext?

2 个答案:

答案 0 :(得分:1)

而不是在xaml中初始化DataContext

<UserControl.DataContext>
    <local:PolaPrzewoznikowViewModel />
</UserControl.DataContext>

我建议使用DesignInstance

<UserControl d:DataContext="{d:DesignInstance Type=local:PolaPrzewoznikowViewModel, 
                             IsDesignTimeCreatable=True}" ...>

它将在设计时为IntelliSense和设计人员提供足够的信息,但是在运行时不会创建新的实例(只有来自WindowService的DataContext)

答案 1 :(得分:0)

为什么要设置窗口的内容和datacontext?

关于智能感知,你应该像ASh所建议的那样,数据上下文本质上可供所有视图后代使用。

如果您不想自己实施窗口服务,可以随时使用我的框架https://github.com/FantasticFiasco/mvvm-dialogs