Wpf 在添加时访问ItemsControl项

Wpf 在添加时访问ItemsControl项,wpf,data-binding,mvvm,datatemplate,Wpf,Data Binding,Mvvm,Datatemplate,在上一篇文章中,有人建议我使用DataTemplate来呈现一组按钮和标签,它工作得非常好。问题是我有几个这样的按钮组,我想区分不同的按钮组。我计划使用AlternatingIndex为每个组添加不同的颜色,但这还不够——每个组实际上也需要打印索引 这里有一个人为的例子。。。假设该项看起来像这样: Lock Door Safe Unlock Door Sound Alarm Lock Door Safe #1 Unlock Door

在上一篇文章中,有人建议我使用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
如果我有一个满是这些保险箱的房间,我想知道我要去哪一个。因此,我希望列表如下所示:

       Lock Door
Safe   Unlock Door
       Sound Alarm
         Lock Door
Safe #1  Unlock Door
         Sound Alarm

         Lock Door
Safe #2  Unlock Door
         Sound Alarm
我的ItemsControl(ListBox)绑定到代码隐藏中的列表。在这里做了一些研究之后,似乎我需要以某种方式绑定ItemsControl.Count属性。我的一个想法是通过IValueConverter传递内容。内容将被数据绑定到ItemsControl.Count。然后,IValueConverter会将字符串格式化为“Safe#{0}”

这是数据绑定部分,我再一次犹豫。此ItemsControl的DataContext是我的ViewModel。。。因此,我只能猜测我需要指定一个绑定,该绑定将为我提供ItemsControl而不是ViewModel


这是正确的想法吗?如果是这样,有人能帮我装订吗?如果没有,我可以尝试其他哪些方法?

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

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

此外,由于不再自动循环索引(因为
AlternationCount
的值很大),因此必须调整alternation count转换器以执行代码中的模数运算。

为绑定提供表示集合中项的索引的属性,将
AlternationCount
属性设置为某个较大的值(大于集合中可能的最大项数),然后可以从数据模板绑定到该属性,因此:

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

另外,由于不再自动循环索引(因为
AlternationCount
的值很大),您必须调整交替计数转换器以进行代码中的模数运算。

@Aviad:谢谢,我会试试的!为了完成,我想发布我刚刚尝试过的东西。我终于按照我提议的方式实现了数据绑定:

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


最终的结果是错误的——所有的ListBox项都有索引“4”,所以我猜所有标签的内容都是在将这些项添加到容器后进行评估的。有趣

@Aviad:谢谢,我试试看!为了完成,我想发布我刚刚尝试过的东西。我终于按照我提议的方式实现了数据绑定:

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


最终的结果是错误的——所有的ListBox项都有索引“4”,所以我猜所有标签的内容都是在将这些项添加到容器后进行评估的。有趣

太棒了,这完全成功了。当我读到关于使用AlternationIndex制作交替背景色的文章时,我完全没有抓住AlternationCount的要点。谢谢。一个快速相关的问题——如果我想得到“保险柜”的索引,我应该从内容中解析出数字,还是有更好的方法?我无法使用SelectedIndex,因为无法保证用户单击按钮时该项目已被选中。此解决方案没有为您提供保险柜的索引吗?是的,以便在GUI中正确呈现。啊,我明白了——正确的处理方法是传递与CommandParameter相同的绑定,不是吗?你把我弄丢了。。。如果您正在处理数据对象上的命令,只需检查集合的
IndexOf
方法即可计算出其索引。太棒了,这完全做到了。当我读到关于使用AlternationIndex制作交替背景色的文章时,我完全没有抓住AlternationCount的要点。谢谢。一个快速相关的问题——如果我想得到“保险柜”的索引,我应该从内容中解析出数字,还是有更好的方法?我无法使用SelectedIndex,因为无法保证用户单击按钮时该项目已被选中。此解决方案没有为您提供保险柜的索引吗?是的,以便在GUI中正确呈现。啊,我明白了——正确的处理方法是传递与CommandParameter相同的绑定,不是吗?你把我弄丢了。。。如果您正在处理数据对象上的命令,只需检查集合的
IndexOf
方法即可确定其索引。