Как получить доступ к элементу ItemsControl ItemsSource из кода элемента ItemsControl? - PullRequest
3 голосов
/ 31 мая 2011

В моем главном представлении у меня есть ItemsControl, который связан с коллекцией объектов:

<ItemsControl ItemsSource="{Binding Path=Concepts}"
              ItemTemplate="{StaticResource ActivationLevelTemplate}"
              />

Где ActivationLevelTemplate - это просто другое представление:

 <DataTemplate x:Key="ActivationLevelTemplate">
    <view:ConceptActivationView Height="50"/>
 </DataTemplate>

В этом представлении есть текстовый блок, связанный со свойством объекта из коллекции, упомянутой выше. Свойство отображается правильно, и теперь мне нужно получить доступ к другим свойствам того же объекта из кода представления. Это кажется тривиальным, но я не мог заставить его работать.

<TextBlock Text="{Binding Path=Name}"
           HorizontalAlignment="Center"
           />
<d3:Plotter2D Name="Plotter"/>    

Лучшее, с чем я столкнулся, было ItemContainerGenerator, но, похоже, это не то, что нужно.

Ответы [ 2 ]

5 голосов
/ 31 мая 2011

Что важно, так это контекст, в котором вы пытаетесь получить доступ к этому объекту.Если вы, например, имеете дело с событием внутри DataTemplate, вы можете легко получить объект из DataContext отправителя (должен быть FrameworkElement), например, если бы я обрабатывал нажатие кнопки:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var button = (FrameworkElement)sender;
    var employee = (Employee)button.DataContext;
    //...
}

Фактически, если все ваше представление находится внутри DataTemplate, вы также можете получить объект непосредственно из DataContext представления.

1 голос
/ 31 мая 2011

Вы должны иметь возможность перебирать элементы в ItemsControl и получать все необходимые вам свойства. Дайте ItemsControl имя, чтобы вы могли обращаться к нему в коде:

<ItemsControl Name="itemsControl" ... />

Тогда в коде позади

foreach (YourItem item in itemsControl.Items)
{
    // your logic...
}

Если вам нужен определенный элемент, вы можете вместо этого использовать CurrentItem или GetItemAt ()

itemsControl.Items.CurrentItem
// or
itemsControl.Items.GetItemAt()
...