我正在尝试创建一个基于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)。
我已经看过了这可能会提供答案,但是我不知道如何在不破坏应用程序其余部分的情况下实现它:
答案 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 };
}
}