在DisplayF中动态地将DisplayMemberPath绑定到ListBox的ItemTemplate?

时间:2018-02-16 20:16:00

标签: c# wpf

我正在创建一个具有ItemsSourceDisplayMemberPath属性的自定义控件,并且在ControlTemplate中有ListBox个控件{39} ; s绑定到此ItemsSourse,我想在此ListBox中使用DisplayMemberPath指定的属性,遗憾的是,这不起作用:

<ListBox ItemsSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ItemsSource}">
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DisplayMemberPath}"/>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>

修改

正如Mike Strobel在评论中提到的那样,当我在一些博客文章中读到时,我删除了ItemTemplate并仅提供了ListBox中的DisplayMemberPath,但这对于列表来说并不是唯一的(&#&} 39; s没有滚动条):

    <ListBox ItemsSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ItemsSource}" 
DisplayMemberPath="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DisplayMemberPath}"/>

我甚至对DisplayMemberPath值进行了硬编码,仍然无效!它只能使用List<string>而不是List<CustomClass>

解决方案

请原谅,我错过了将DP类型从IEnumerable<string>更改为IEnumerable<object> 谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

可能是TemplatedParent对象不是你想象的那样吗?您是否尝试按指定类型进行遍历?

<ListBox ItemsSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ItemsSource}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type **TYPE**}}, Path=DisplayMemberPath}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>