【问题标题】:Accessing an ItemsControl item as it is added在添加 ItemsControl 项时对其进行访问
【发布时间】:2011-01-01 16:56:51
【问题描述】:

在上一篇文章中,有人建议我使用 DataTemplate 来渲染一组按钮和标签,效果非常好。问题是我有几个这样的按钮组,我想将一组与另一组区分开来。我计划使用 AlternatingIndex 为每个组着色,但这还不够——实际上每个组还需要打印其索引。

这是一个人为的例子...假设 Item 看起来像这样:

       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 会将字符串格式化为“Safe #{0}”。

这是我再次步履蹒跚的数据绑定部分。这个 ItemsControl 的 DataContext 是我的 ViewModel...所以我只能猜测我需要指定一个 Binding 来给我 ItemsControl 而不是 ViewModel。

这是正确的想法吗?如果是这样,有人可以帮助我进行绑定吗?如果没有,我还可以尝试哪些其他方法?

【问题讨论】:

    标签: wpf data-binding mvvm datatemplate


    【解决方案1】:

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

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

    此外,您将不得不调整交替计数转换器以在代码中进行取模,因为您不再自动循环索引(因为 AlternationCount 的值很大)。

    【讨论】:

    • 太棒了,这完全成功了。当我读到使用 AlternationIndex 来制作交替背景颜色时,我完全错过了 AlternationCount 的要点。谢谢。
    • 一个快速相关的问题——如果我想获得“安全”的索引,我应该从内容中解析出数字,还是有更好的方法?我不能使用 SelectedIndex,因为不能保证当用户单击按钮时该项目被选中。
    • 这个解决方案没有给你保险箱的索引吗?
    • 是的,为了在 GUI 中正确呈现它。啊,我明白了——处理这个问题的正确方法是传递与 CommandParameter 相同的绑定,不是吗?
    • 你弄丢了我......如果你正在处理一个数据对象的命令,你可以简单地检查你的集合的IndexOf方法来找出它的索引。
    【解决方案2】:

    @Aviad:谢谢,我会试试的!只是为了完成,我想发布我刚刚尝试过的内容。我终于让数据绑定按照我建议的方式工作了:

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-03
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多