Доступ к элементу ItemsControl по мере его добавления - PullRequest
0 голосов
/ 05 января 2010

В предыдущем посте мне посоветовали использовать 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

Мой ItemsControl (ListBox) привязан к списку в коде позади. После некоторого исследования SO здесь кажется, что мне нужно каким-то образом связать свойство ItemsControl.Count. У меня была одна идея - передать Контент через IValueConverter. Содержимое будет привязано к ItemsControl.Count. Тогда IValueConverter просто отформатирует строку так: «Safe # {0}».

Это та часть связывания данных, над которой я снова запинаюсь. DataContext для этого ItemsControl - это моя ViewModel ... поэтому я могу только догадываться, что мне нужно указать Binding, который даст мне ItemsControl вместо ViewModel.

Это правильная идея? Если да, может ли кто-нибудь помочь мне с привязкой? Если нет, то какие еще методы я могу попробовать?

Ответы [ 2 ]

3 голосов
/ 05 января 2010

Чтобы предоставить свойство для привязки, представляющее индекс элемента в коллекции, задайте для свойства AlternationCount какое-то огромное значение (большее, чем максимально возможное количество элементов в коллекции), после чего вы можете связать его с ним. из вашего шаблона данных таким образом:

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

Кроме того, вам придется настроить преобразователь счетчика чередования, чтобы выполнить модуль в коде, поскольку вы больше не циклически изменяете индекс (из-за большого значения AlternationCount).

0 голосов
/ 05 января 2010

@ Авиад: спасибо, я попробую! Ради завершения, я хотел опубликовать то, что я только что попробовал. Наконец-то я получил привязку к данным так, как предложил:

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

Конечный результат был неверным - все элементы ListBox имели индекс «4», поэтому я предполагаю, что содержимое всех меток оценивается после добавления элементов в контейнер. Интересно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...