使用DataContext显示新窗口

时间:2016-12-01 21:03:22

标签: c# wpf mvvm user-controls viewmodel

我想在一个单独的窗口中显示我的UserControl,例如通过调用

var windowHandler = new WindowHandler();
windowHandler.Show(new SchoolViewModel);

如何存档?我尝试过以下方法:

在App.xaml中设置DataTemplate

<Application.Resources>
    <ResourceDictionary>
        <DataTemplate DataType="{x:Type viewModel:SchoolViewModel}">
            <view:SchoolUserControl />
        </DataTemplate>
    </ResourceDictionary>
</Application.Resources>

在代码隐藏中调用它:

private void Application_Startup(object sender, StartupEventArgs e)
{
    var windowHandler = new WindowHandler();
    windowHandler.ShowWindow(new SchoolViewModel(), 200, 200);
}

WindowHandler类:

public class WindowHandler
{
    public void ShowWindow(object dataContext, int height, int width)
    {
        Window window = new Window()
        {
            DataContext = dataContext,
            Width = width,
            Height = height
        };
        window.Show();
    }
}

它确实显示了一个窗口,但它是空的。它为什么空?我还在DataContext的代码隐藏中设置了UserControl

public SchoolUserControl()
{
    InitializeComponent();
    DataContext = this;
}

1 个答案:

答案 0 :(得分:0)

默认情况下,

Window模板显示为Window.Content而非Window.DataContext。因此,您应该将要显示的内容分配为内容:

public class WindowHandler
{
    public void ShowWindow(object dataContext, int height, int width)
    {
        Window window = new Window()
        {
            Content = dataContext,
            Width = width,
            Height = height
        };
        window.Show();
    }
}

另外,正如其他人所说,你应该删除这一行:

DataContext = this;
来自SchoolUserControl

,因为否则您将无法访问控件中的模板化视图模型。由于SchoolUserControlDataTemplate的一部分,因此模板化的视图模型将自动从SchoolUserControl.DataContext获取。