C# 如何允许WPF在使用Prism时解析窗口控件的ContentTemplate?

C# 如何允许WPF在使用Prism时解析窗口控件的ContentTemplate?,c#,wpf,prism,C#,Wpf,Prism,我试图创建一个简单的对话框类型控件,它基于WPF窗口类(弹出窗口在这里不起作用)。 在我的应用程序中,我在应用程序中注册了一个DataTemplate。参考资料: <Application.Resources> <DataTemplate DataType="{x:Type local:EntitySelectorViewModel}"> <local:EntitySelector></local:EntitySelector&

我试图创建一个简单的对话框类型控件,它基于WPF窗口类(弹出窗口在这里不起作用)。 在我的应用程序中,我在应用程序中注册了一个DataTemplate。参考资料:

<Application.Resources>
    <DataTemplate  DataType="{x:Type local:EntitySelectorViewModel}">
        <local:EntitySelector></local:EntitySelector>
    </DataTemplate>        
</Application.Resources>
问题是WPF没有解析ContentTemplate,即没有创建EntitySelector的实例。此外,当我查看EntitySelectorDialog的XAML时,我看到已经注入了一个shell实例 进入窗口控件(EntitySelectorDialog)

我对Prism了解不够,不知道我是想顺其自然,以某种方式使用外壳,还是想阻止Prism注入外壳。我不认为我有任何需要在这个具体的控制,所以如果它是有意义的,只是防止棱镜注射它,我宁愿那个路线

作为记录,我尝试从我的窗口控件中删除棱柱属性,并手动更新组件。这似乎没有效果——Prism仍然设法以某种方式注入shell,而我的ContentTemplate没有解析

除了窗口声明本身之外,窗口控件(EntitySelectorDialog)没有XAML可显示-我希望内容完全来自ContentTemplate(EntitySelector)

我已经看过了,这可能会提供一个答案,但我不知道如何在不破坏应用程序其余部分的情况下实现它:


您需要将
vm
设置为
entityselector或alog.Content
以触发WPF,并根据类型解决
数据模板的问题。所以你要么加上

Content = vm;
在构造函数中或添加

Content = {Bing}

在Xaml中

将窗口的
内容设置为
内容控件
,并将此属性的
内容
属性设置或绑定到视图模型:

[Export(typeof(EntitySelectorDialog))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public partial class EntitySelectorDialog : Window
{
    [ImportingConstructor]
    public EntitySelectorDialog(EntitySelectorViewModel vm)
    {
        InitializeComponent();
        DataContext = vm;
        Content = new ContentControl() { Content = vm };
    }
}

是什么阻止您使用
ViewModelLocator
?为什么MEF-Unity或任何其他真正的DI容器更适合?创建和显示窗口的代码是什么样子的?谢谢Alex-你当然是正确的,但是WPF不配合。它不起作用。谢谢。我认为你的答案是正确的,但它仍然不起作用。发生了什么?你在窗户里看到了什么?我什么也没看到。未创建视图的实例(EntitySelector)。如果将内容设置为TextBlock怎么办?你看到了吗?你已经确认你在窗口的构造函数中得到了EntitySelectorViewModel?
[Export(typeof(EntitySelectorDialog))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public partial class EntitySelectorDialog : Window
{
    [ImportingConstructor]
    public EntitySelectorDialog(EntitySelectorViewModel vm)
    {
        InitializeComponent();
        DataContext = vm;
        Content = new ContentControl() { Content = vm };
    }
}