简单的问题。我们希望在水平样式列表框中的每个项目之间显示分隔符。想想crumbtrail中条目之间的箭头。但是,我们不希望分隔符成为选择的一部分,因此它应该在每个ListBoxItem之间。有可能吗?
我能想到的唯一两种方法是将“分隔符”项插入到数据中并以不同方式对它们进行模板化,但这需要对项集合进行修改,这在数据绑定情况下可能无法执行
唯一的另一种方法是将实际的ListBoxItem设置为在突出显示边框之外设置分隔符,然后分别为列表中的最后一个设置模板。
有人能想到其他任何方法吗?
答案 0 :(得分:1)
有趣的问题! 正如你所说,一种方法是模拟ItemsSource集合。 如:
<ListBox.ItemsSource>
<MultiBinding Converter="{StaticResource mockConverter}">
<Binding Path="YourCustomList" />
</MultiBinding>
</ListBox.ItemsSource>
请注意,我使用了只有一个绑定的多绑定。我认为这是转换器“重新运行”的正确方法。这样,当您修改“YourCustomList”中的项目时,它将重新触发转换器。
与此不同,它只会触发转换器一次(当ItemsSource首次绑定时)
<ListBox ItemsSource="{Binding YourCUstomList, Converter={StaticResource mockCOnverter}}" />
如果添加新项目,^将不起作用。(仅当YourCustomList属性更改时,才会重新运行转换器)
MockConverter很简单,只需确保生成带有分隔符的列表。你需要一个分离器的新课程。这样您就可以轻松使用DataTemplates(DataType)。接下来,您可能必须在ItemContainerStyle中设置一个新触发器,以便在object = Seperator时设置IsEnabled = false。
这将是相对无痛的,我认为没有并发症。它有点难看,因为分隔符不应该是ListBoxItems。
也许这也可行。 您可以使用自己的方法覆盖ListBox ItemsPanelTemplate。在您自己的模板中,您可以随心所欲。也许添加分隔符。这样,您就不会触及ItemsSource。
查看StackPanel.cs以获取代码。 我现在无法提供代码,但这个想法是这样的;你从StackPanel继承,并覆盖Measure()和Arrange()。使用这些函数,您可以计算stackPanel应该有多大,并提供应该绘制分隔符的位置(X,y)。 请注意,分隔符必须是StackPanel的Children并且它们需要具有IsHitTestVisible = False(因此它们不会生成事件)。
以后的解决方案需要时间,但如果你正在学习WPF,那为什么不呢?
答案 1 :(得分:0)
DataTemplate很好,我不认为你会在模拟项目集合时遇到问题。为什么你呢?
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Seperator/>
<TextBlock Text="{Binding .}"/>
</StackPanel/>
</DataTemplate>
我不会推荐你的最后一个选项。只是为了达到你想要的效果而将它分开来是不对的。