ItemsControl.ItemTemplate中的ContentPresenter显示itemscontrol的displaymemberpath

问题描述 投票:5回答:3

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

c# wpf itemscontrol contentpresenter
3个回答
3
投票

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

您通常使用ContentPresenterControlTemplate中的ContentControl来指定要添加内容的位置。

你可以做的是,在DataTemplate部分(用Resourcess完成)声明一些Binding Paths用于不同类型的数据,并省略x:Key指令,例如。不要命名他们。另外,不要为ItemsControl.ItemTemplate指定一个。

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


0
投票

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


0
投票

是的,它运作良好。在ContentControl的模板之外,您必须手动绑定内容:

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

我做了很多,但从来没有行为不端。 ContentPresenter似乎是为了一般用途而实现的。我想知道API文档是否夸大了它与ContentControl的关系。

© www.soinside.com 2019 - 2024. All rights reserved.