我有一个DataTemplate,如果我做类似的事情,它的DataType是MyViewModel:

<ContentPresenter Content="{Binding SomeViewModel}"/>

如果将“SomeViewModel”设置为MyViewModel(在DataTemplate中定义的VM),则可以在 View 上看到DataTemplate渲染,这是预期的。

我想做的是这样的:
Window host = new Window()
host.Content = new MyViewModel();
host.Show();

我希望这会显示一个带有与MyViewModel渲染相关联的DataTemplate的窗口,而不是一个带有单行的窗口,即我的ViewModel的路径。

我究竟做错了什么 ?

最佳答案

可能是资源位置问题。以前在哪里定义了DataTemplate?它在App.xaml的ResourceDictionary中吗?尝试在其中添加DataTemplate

<Application ...>
     <Application.Resources>
         <DataTemplate DataType="{x:Type MyViewModel}">
             <!-- View -->
         </DataTemplate>
     </Application.Resources>
</Application>

在更好的情况下,您可以将其放置在ResourceDictionary中,并将其与App.xaml中的其他人合并。

编辑:很小的工作示例。
<Application x:Class="DataTemplateTest.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:sys="clr-namespace:System;assembly=mscorlib"
         Startup="Application_Startup">
    <Application.Resources>
        <DataTemplate DataType="{x:Type sys:Int32}">
            <Border Background="Red">
                <TextBlock Text="{Binding}" />
            </Border>
        </DataTemplate>
    </Application.Resources>
</Application>

适当的代码隐藏:
public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        var window = new Window();
        window.Content = 42;
        window.Show();
    }
}

编辑2:由于您说过此代码在WPF加载项
  • 如果DataTemplate在主机应用程序中,则将无法使用。主机和加载项UI不会以这种方式互相交谈,因为加载项仅仅是HwndSource
  • 如果DataTemplate在AddIn的ResourceDictionary中,则可以这样加载它:
    var window = new Window();
    window.Resources.MergedDictionaries.Add(
        new ResourceDictionary
        {
            Source =
                new Uri("pack://application:,,,/AddInAssembly;component/Resources.xaml",
                        UriKind.Relative)
        });
    window.Content = ...;
    window.Show();
    
  • 关于wpf - 具有DataTemplate的Window.Content,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5382821/

    10-12 00:25