ItemControl.ItemTemplate 中的 ContentPresenter 以显示 itemscontrol 的 displaymemberpath
ContentPresenter in ItemControl.ItemTemplate to show displaymemberpath of itemscontrol
我想知道是否可以将 contentpresenter 放在 itemscontrol 的 itemtemplate 中以显示我的数据。我不想要像 Text="{Binding username}" 这样的硬代码绑定,因为我正在构建自定义控件,我认为 ContentPresenter 是我想要的。但是在我尝试使用 contentpresenter 之后,它给了我 Whosebugexception。
<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>
这是我的代码。
如果没有这些分隔符和项目模板,我可以仅使用 displaymemberpath 来显示我的数据,但它会将所有名称堆叠在一起。我仍然在寻找任何解决方案来解决它。我希望你能提供一些想法来做到这一点。
答案是否定的,你不能。 ContentPresenter
应该用在 ControlTemplate
中,而不是 DataTemplate
,因此 不是 使用的正确控件。来自 MSDN 上的链接页面:
You typically use the ContentPresenter
in the ControlTemplate
of a ContentControl
to specify where the content is to be added.
您还可以做的是,在 Resources
部分(包括 Binding Path
部分)为不同类型的数据声明多个 DataTemplate
,并省略 x:Key
指令,例如。 不要 给它们命名。此外,不要 为ItemsControl.ItemTemplate
指定一个。
执行此操作时,WPF 将隐式 select 相关数据类型的正确 DataTemplate
,因此您可以为不同的数据类型提供不同的输出。有关此技术的进一步说明,请参阅 MSDN 上 Data Templating Overview 页面的 The DataType 属性 部分。
我找到了一种更简单的方法来解决这个问题,那就是使用水平列表框。感谢回复
是的,而且效果很好。在 ContentControl 的模板之外,您必须手动绑定内容:
<ContentPresenter Content="{Binding username}"/>
我经常这样做,而且它从不出错。 ContentPresenter 似乎是为一般用途而实施的。我想知道 API 文档是否夸大了它与 ContentControl 的关系。
我想知道是否可以将 contentpresenter 放在 itemscontrol 的 itemtemplate 中以显示我的数据。我不想要像 Text="{Binding username}" 这样的硬代码绑定,因为我正在构建自定义控件,我认为 ContentPresenter 是我想要的。但是在我尝试使用 contentpresenter 之后,它给了我 Whosebugexception。
<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>
这是我的代码。 如果没有这些分隔符和项目模板,我可以仅使用 displaymemberpath 来显示我的数据,但它会将所有名称堆叠在一起。我仍然在寻找任何解决方案来解决它。我希望你能提供一些想法来做到这一点。
答案是否定的,你不能。 ContentPresenter
应该用在 ControlTemplate
中,而不是 DataTemplate
,因此 不是 使用的正确控件。来自 MSDN 上的链接页面:
You typically use the
ContentPresenter
in theControlTemplate
of aContentControl
to specify where the content is to be added.
您还可以做的是,在 Resources
部分(包括 Binding Path
部分)为不同类型的数据声明多个 DataTemplate
,并省略 x:Key
指令,例如。 不要 给它们命名。此外,不要 为ItemsControl.ItemTemplate
指定一个。
执行此操作时,WPF 将隐式 select 相关数据类型的正确 DataTemplate
,因此您可以为不同的数据类型提供不同的输出。有关此技术的进一步说明,请参阅 MSDN 上 Data Templating Overview 页面的 The DataType 属性 部分。
我找到了一种更简单的方法来解决这个问题,那就是使用水平列表框。感谢回复
是的,而且效果很好。在 ContentControl 的模板之外,您必须手动绑定内容:
<ContentPresenter Content="{Binding username}"/>
我经常这样做,而且它从不出错。 ContentPresenter 似乎是为一般用途而实施的。我想知道 API 文档是否夸大了它与 ContentControl 的关系。