ItemControl.ItemTemplate中的ContentPresenter显示itemscontrol

时间:2015-06-15 11:07:23

标签: c# wpf itemscontrol contentpresenter

我想知道无论如何将contentpresenter放在itemscontrol的itemtemplate中以显示我的数据。我不想像Text =“{Binding username}”这样的硬编码绑定,因为我正在构建一个自定义控件,我认为ContentPresenter就是我想要的。但是在我尝试使用contentpresenter之后,它给了我stackoverflowexception。

    <ItemsControl ItemsSource="{Binding SelectedItems, ElementName=listbox}" DisplayMemberPath={Binding DisplayMemberPath}">
        <ItemsControl.ItemPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal" IsItemsHost="True"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock x:Name="Separator" Text=", "/>
                    <ContentPresenter/>
                    <!--<TextBlock Text="{Binding username}"/>-->
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

这是我的代码。 如果没有那些seperator和itemtemplate,我只能使用displaymemberpath显示我的数据,但它将所有名称叠加在一起。我仍然找到任何解决方案来解决它。我希望你能提供一些想法来做到这一点。

3 个答案:

答案 0 :(得分:3)

答案是否定的,你不能。 ControlTemplate应该用于DataTemplate,而不是ContentPresenter,因此使用正确的控件。从MSDN上的链接页面:

  

您通常使用ControlTemplate的{​​{1}}中的ContentControl来指定要添加内容的位置。

您可以做的是,在DataTemplate部分(对Resources s)声明一些Binding Path s用于不同类型的数据,并省略{{1指令,例如。 为他们命名。另外,x:Key指定一个。

执行此操作时,WPF将隐式为相关数据类型选择正确的ItemsControl.ItemTemplate,因此您可以为不同的数据类型提供不同的输出。有关此技术的进一步说明,请参阅MSDN上ContentPresenter页面的 DataType属性部分。

答案 1 :(得分:0)

通过使用水平列表框,我找到了一种更简单的方法来解决这个问题。感谢您的回复

答案 2 :(得分:0)

是的,并且效果很好。在ContentControl模板之外,您必须手动绑定Content:

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

我做了很多,而且从来没有做错。 ContentPresenter似乎已实现通用。我想知道API文档是否夸大了它与ContentControl的关系。