在添加ItemsControl项时访问它

时间:2010-01-05 15:54:27

标签: wpf data-binding mvvm datatemplate

在上一篇文章中,我被建议使用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。

这是正确的想法吗?如果是这样,有人可以帮我绑定吗?如果没有,我可以尝试其他什么方法?

2 个答案:

答案 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”,所以我想在将项目添加到容器后评估所有标签的内容。有趣的!