2010-01-05 100 views
0

在之前的文章中,我被建议使用DataTemplate来渲染一组按钮和标签,它的工作原理非常奇妙。问题是我有几组按钮,我想区分一组。我计划使用AlternatingIndex以不同的方式为每个组着色,但这还不够 - 每个组实际上也需要打印其索引。添加ItemsControl项目时添加

这里是一个人为的例子...让我们说这个项目看起来是这样的:

 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传递内容。内容将数据绑定到ItemsControl.Count。然后,IValueConverter会将该字符串格式化为“安全#{0}”。

这是数据绑定的一部分,我再次徘徊不前。这个ItemsControl的DataContext是我的ViewModel ...所以我只能猜测我需要指定一个绑定,它会给我ItemsControl而不是ViewModel。

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

回答

3

要提供表示集合中项目索引的绑定属性,请将AlternationCount属性设置为某个巨大值(大于集合中项目的最大可能数量),然后您可以将其绑定到因此,你的数据模板:

{Binding RelativeSource={RelativeSource TemplatedParent}, 
     Path=TemplatedParent.(ItemsControl.AlternationIndex)} 

此外,你必须调整你的交替计算转换做模量的代码,因为你不再自动循环索引(因为AlternationCount大值)。

+0

太棒了,这完全没有把戏。当我阅读有关使用AlternationIndex制作交替背景颜色的信息时,我完全错过了AlternationCount的要点。谢谢。 – Dave 2010-01-05 17:28:05

+0

一个快速相关的问题 - 如果我想获得“安全”的索引,我应该从内容中解析出数字,还是有更好的方法?我无法使用SelectedIndex,因为不能保证在用户单击按钮时选择了该项目。 – Dave 2010-01-05 17:48:25

+0

这个解决方案没有给你安全的索引吗? – 2010-01-05 18:00:05

0

@Aviad:谢谢,我会试试!为了完成,我想发布我刚刚尝试过的内容。我终于得到了数据绑定工作,我曾提议道:

<Label Grid.Row="1" Grid.Column="0" Content="{Binding Path=Items.Count, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"></Label> 

最终的结果是错误的 - 所有的列表框项有指标“4”,所以我想所有标签的内容变将物品添加到容器后进行评估。有趣!