目标:我希望拥有一个包含我的数据的对象,并将其绑定到 ContentPresenter,该 ContentPresenter 使用自定义 ContentTemplateSelector 选择适当的数据模板以在主控件中呈现。
问题: DataTemplate 在主控件中没有按预期呈现;它不呈现指定的视图控件。
代码:
MainView.xaml:
<Window x:Class="WpfContentTemplateSelector.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:this="clr-namespace:WpfContentTemplateSelector"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.Resources>
<this:ObjectWrapper x:Key="wrapper"/>
</Grid.Resources>
<ContentPresenter Content="{Binding Value}" DataContext="{StaticResource ResourceKey=wrapper}">
<ContentPresenter.ContentTemplateSelector>
<this:TemplateSelector/>
</ContentPresenter.ContentTemplateSelector>
</ContentPresenter>
</Grid>
</Window>
数据对象.cs:
class DataObject
{
public string Title { get; set; }
public DataObject()
{
Title = "Title";
}
}
ObjectWrapper.cs:
class ObjectWrapper
{
public DataObject Value { get; set; }
public ObjectWrapper()
{
Value = new DataObject();
}
}
模板选择器.cs:
class TemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
DataTemplate template = new DataTemplate(typeof(View));
return template;
}
}
查看.xaml:
<UserControl x:Class="WpfContentTemplateSelector.View"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:this="clr-namespace:WpfContentTemplateSelector"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" Background="Navy">
<Grid Background="Navy">
<Button Height="30" Content="{Binding Title}"/>
</Grid>
</UserControl>
概括:
- ObjectWrapper 初始化。
- DataObject 初始化。
- 在初始化时,TemplateSelector 创建一个新的 DataTemplate。
- 创建的 DataTemplate 在其构造函数中使用 View 类型。
- 对象全部初始化,主视图的datacontext设置为DataObject,视图仍然没有渲染到主窗口。