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 的关系。