#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()