Как получить доступ к элементу ItemsSource ItemsControl из кода элемента ItemsControl, находящегося за ним?

#wpf #itemscontrol #code-behind

#wpf #itemscontrol #скрытый код

Вопрос:

В моем основном представлении у меня есть 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 но, похоже, это не то, что нужно.

Комментарии:

1. Что вы пытаетесь сделать в исходном коде?

2. Мне нужно получить некоторые графические данные из объекта, чтобы построить несколько линий.

Ответ №1:

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

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

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

Комментарии:

1. О, DataContext как Employee! Это было так просто! Большое вам спасибо! Теперь это работает.

2. Рад, что помогло 🙂 (Вы можете принять этот ответ, щелкнув по контуру галочки слева от ответа)

3. как получить доступ к родственным кнопкам, например, мне нужно очистить предыдущий стиль кнопки при нажатии на текущую?

4. @Batur: Вы должны связать их либо в своих данных, либо в XAML, предварительно используя привязки / ссылки.

Ответ №2:

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

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

Затем в code behind

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

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

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