在上一篇文章中,我被建议使用DataTemplate来渲染一组按钮和标签,它的工作非常精彩。问题是我有几组按钮,我想区分一组和另一组。我计划使用AlternatingIndex以不同方式为每个组着色,但这还不够 - 每个组实际上也需要打印其索引。
这是一个人为的例子......让我们说项目看起来像这样:
Lock Door
Safe Unlock Door
Sound Alarm
如果我有一间满是这些保险箱的房间,我想知道我正在访问哪一个。因此,我希望列表看起来像这样:
Lock Door
Safe #1 Unlock Door
Sound Alarm
Lock Door
Safe #2 Unlock Door
Sound Alarm
My ItemsControl(ListBox)绑定到代码隐藏中的List。在对SO进行一些研究后,似乎我需要以某种方式绑定ItemsControl.Count属性。我的一个想法是通过IValueConverter传递内容。 Content将数据绑定到ItemsControl.Count。然后IValueConverter将字符串格式化为“Safe#{0}”。
这是我再次步履蹒跚的数据绑定部分。这个ItemsControl的DataContext是我的ViewModel ...所以我只能猜测我需要指定一个Binding,它会给我ItemsControl而不是ViewModel。
这是正确的想法吗?如果是这样,有人可以帮我绑定吗?如果没有,我可以尝试其他什么方法?
答案 0 :(得分:3)
要为表示集合中项目索引的绑定提供属性,请将AlternationCount
属性设置为某个巨大值(大于集合中项目的最大可能数量),然后您可以绑定从你的数据模板到它:
{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplatedParent.(ItemsControl.AlternationIndex)}
此外,您必须调整交替计数转换器以在代码中执行模数,因为您不再自动循环索引(因为AlternationCount
的值很大)。
答案 1 :(得分:0)
@Aviad:谢谢,我会试试的!为了完成起见,我想发布我刚试过的内容。我终于让数据绑定以我提出的方式工作:
<Label Grid.Row="1" Grid.Column="0" Content="{Binding Path=Items.Count, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"></Label>
最终结果是错误的 - 所有ListBox项都有索引“4”,所以我想在将项目添加到容器后评估所有标签的内容。有趣的!