我想知道无论如何将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显示我的数据,但它将所有名称叠加在一起。我仍然找到任何解决方案来解决它。我希望你能提供一些想法来做到这一点。
答案 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的关系。