我想知道无论如何将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显示我的数据,但它将所有名称叠加在一起。我仍然找到任何解决方案来解决它。我希望你能提供一些想法来做到这一点。
答案是否定的,你不能。 ContentPresenter
应该用于ControlTemplate
,而不是DataTemplate
,因此它不适合使用。从MSDN上的链接页面:
您通常使用
ContentPresenter
的ControlTemplate
中的ContentControl
来指定要添加内容的位置。
你可以做的是,在DataTemplate
部分(用Resources
s完成)声明一些Binding Path
s用于不同类型的数据,并省略x:Key
指令,例如。不要命名他们。另外,不要为ItemsControl.ItemTemplate
指定一个。
执行此操作时,WPF将隐式为相关数据类型选择正确的DataTemplate
,因此您可以为不同的数据类型提供不同的输出。有关此技术的进一步说明,请参阅MSDN上Data Templating Overview页面的DataType属性部分。
通过使用水平列表框,我找到了一种更简单的方法来解决这个问题。谢谢你的回复
是的,它运作良好。在ContentControl的模板之外,您必须手动绑定内容:
<ContentPresenter Content="{Binding username}"/>
我做了很多,但从来没有行为不端。 ContentPresenter似乎是为了一般用途而实现的。我想知道API文档是否夸大了它与ContentControl的关系。