【发布时间】:2018-08-23 19:26:45
【问题描述】:
我正在尝试创建一个基于 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 了解得不够多,不知道我是否想顺其自然并以某种方式使用 shell,或者我是否想完全阻止 Prism 注入它。我认为在这个特定的控制中我不需要它,所以如果阻止 Prism 注入它是有意义的,我会更喜欢这条路线。
作为记录,我已尝试从 Window 控件中删除 Prism 属性,并手动新建了组件。这似乎没有效果 - Prism 仍然设法以某种方式注入外壳,并且我的 ContentTemplate 没有解决。
除了 Window 声明本身之外,没有要为 Window 控件 (EntitySelectorDialog) 显示的 XAML - 我希望内容完全来自 ContentTemplate (EntitySelector)。
我看过这个可能会提供答案,但我不知道如何在不破坏应用程序其余部分的情况下实现它:
【问题讨论】:
-
是什么阻止您使用
ViewModelLocator?为什么 MEF - Unity 或任何其他真正的 DI 容器更适合?创建和显示窗口的代码是什么样的?