首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF ContentTemplateSelector怪异

WPF ContentTemplateSelector怪异
EN

Stack Overflow用户
提问于 2012-08-19 19:12:47
回答 2查看 2.5K关注 0票数 1

目标:我希望有一个包含我的数据的对象,并将它绑定到一个使用自定义ContentTemplateSelector来选择适当的数据模板在主控件中呈现的ContentPresenter上。

问题: DataTemplate没有按照主控件中的预期呈现;它没有呈现指定的视图控件。

代码:

MainView.xaml:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
class DataObject
{
    public string Title { get; set; }

    public DataObject()
    {
        Title = "Title";
    }
}

ObjectWrapper.cs:

代码语言:javascript
复制
class ObjectWrapper
{
    public DataObject Value { get; set; }

    public ObjectWrapper()
    {
        Value = new DataObject();
    }
}

TemplateSelector.cs:

代码语言:javascript
复制
class TemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        DataTemplate template = new DataTemplate(typeof(View));

        return template;
    }
}

View.xaml:

代码语言:javascript
复制
<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在其构造函数中使用视图类型。
  • 对象都已初始化,主视图的数据文本设置为DataObject,视图仍未呈现到主窗口。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-19 20:28:34

您的问题是,在您的TemplateSelector中,您为View类型定义了一个DataTemplate,但是您没有给它任何内容。您的代码相当于以下内容:

代码语言:javascript
复制
<ContentPresenter Content="{Binding Value}" DataContext="{StaticResource ResourceKey=wrapper}">
    <ContentPresenter.ContentTemplate>
        <DataTemplate DataType="this:View">
        </DataTemplate>
    </ContentPresenter.ContentTemplate>
</ContentPresenter>

在这里,您只是为类型定义一个空的DataTemplate,而实际上您需要的是包含View控件的DataTemplate:

代码语言:javascript
复制
<ContentPresenter Content="{Binding Value}" DataContext="{StaticResource ResourceKey=wrapper}">
    <ContentPresenter.ContentTemplate>
        <DataTemplate>
            <this:View />
        </DataTemplate>
    </ContentPresenter.ContentTemplate>
</ContentPresenter>

因此,您需要做的是修改TemplateSelector以返回适当的DataTemplate对象。

票数 2
EN

Stack Overflow用户

发布于 2012-08-20 18:58:22

Adi的响应显示,我正在创建的DataTemplate对象的子节点没有呈现构造函数中使用的视图。

为了在代码背后添加DataTemplate的可视化树,我扩展了我的TemplateSelector对象以使用以下代码:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12029214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档