如何从ItemsControl的Item代码后面访问ItemsControl的ItemsSource元素?

时间:2011-05-31 06:55:28

标签: wpf itemscontrol code-behind

在我的主视图中,我有一个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 个答案:

答案 0 :(得分:5)

重要的是您尝试访问该对象的上下文。例如,如果您处理DataTemplate中的事件,您可以轻松地从发送方的DataContext获取对象(必须是FrameworkElement),例如,如果我要处理按钮点击:

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

事实上,如果你的整个视图都在DataTemplate中,你也可以直接从View的DataContext中获取对象。

答案 1 :(得分:1)

您应该能够遍历ItemsControl中的项目并获取所需的所有属性。为ItemsControl指定一个名称,以便在后面的代码中解决它:

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

然后在代码背后

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

如果您需要特定项目,可以尝试使用CurrentItem或GetItemAt()

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