使用Prism时,如何允许WPF为Window控件解析ContentTemplate?

时间:2018-08-23 19:26:45

标签: c# wpf prism

我正在尝试创建一个基于WPF Window类的简单对话框类型的控件(Popup在这里不会解决问题)。 在我的应用程序中,我在Application.Resources中注册了一个DataTemplate:

<Application.Resources>
    <DataTemplate  DataType="{x:Type local:EntitySelectorViewModel}">
        <local:EntitySelector></local:EntitySelector>
    </DataTemplate>        
</Application.Resources>

在我的Window控件中,我设置了Window.Content,并且我希望WPF将根据上面显示的DataTemplate注册将ContentTemplate设置为EntitySelector的实例:

[Export(typeof(EntitySelectorDialog))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public partial class EntitySelectorDialog : Window
{
    [ImportingConstructor]
    public EntitySelectorDialog(EntitySelectorViewModel vm)
    {
        InitializeComponent();

           // DataContext = vm;  // does not work

           // EDIT: Per two answers shown below the following should work but it does not.
           Content = vm;  
    }
}

问题是WPF无法解析ContentTemplate,即未创建EntitySelector实例。此外,当我查看EntitySelectorDialog的XAML时,我看到已经注入了shell实例。 进入窗口控件(EntitySelectorDialog)。

我对Prism的了解还不足以知道我是否想顺其自然,以某种方式使用外壳,或者是否想完全阻止Prism注入它。我认为在此特定控件中不需要它,因此,如果仅防止Prism注入有道理,我会选择该路线。

出于记录目的,我尝试从Window控件中删除Prism属性,然后手动更新组件。这似乎没有任何效果-Prism仍然设法以某种方式注入了外壳,而我的ContentTemplate没有得到解决。

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

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

Getting Unity to Resolve views in XAML

2 个答案:

答案 0 :(得分:0)

您需要将vm设置为EntitySelectorDialog.Content才能触发WPF根据类型来解决DataTemplate。所以您要么添加

Content = vm;

在构造函数中或添加

Content = {Bing}

在Xaml中。

答案 1 :(得分:0)

将窗口的Content设置为ContentControl,并将该属性的Content设置或绑定到视图模型:

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