我有一个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/