目标:我希望有一个包含我的数据的对象,并将它绑定到一个使用自定义ContentTemplateSelector来选择适当的数据模板在主控件中呈现的ContentPresenter上。
问题: 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>DataObject.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();
}
}TemplateSelector.cs:
class TemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
DataTemplate template = new DataTemplate(typeof(View));
return template;
}
}View.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>摘要:
发布于 2012-08-19 20:28:34
您的问题是,在您的TemplateSelector中,您为View类型定义了一个DataTemplate,但是您没有给它任何内容。您的代码相当于以下内容:
<ContentPresenter Content="{Binding Value}" DataContext="{StaticResource ResourceKey=wrapper}">
<ContentPresenter.ContentTemplate>
<DataTemplate DataType="this:View">
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>在这里,您只是为类型定义一个空的DataTemplate,而实际上您需要的是包含View控件的DataTemplate:
<ContentPresenter Content="{Binding Value}" DataContext="{StaticResource ResourceKey=wrapper}">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<this:View />
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>因此,您需要做的是修改TemplateSelector以返回适当的DataTemplate对象。
发布于 2012-08-20 18:58:22
Adi的响应显示,我正在创建的DataTemplate对象的子节点没有呈现构造函数中使用的视图。
为了在代码背后添加DataTemplate的可视化树,我扩展了我的TemplateSelector对象以使用以下代码:
class TemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
View view = item as View;
DataTemplate template = new DataTemplate(typeof(View));
FrameworkElementFactory factory = new FrameworkElementFactory(typeof(View));
template.VisualTree = factory;
return template;
}
}这成功地更改了可视化树,并使用我的自定义TemplateSelector来呈现视图以提供DataTemplate。
https://stackoverflow.com/questions/12029214
复制相似问题