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

3
在我的主视图中,我有一个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,但它似乎不是所需的。


你在代码背后试图做什么? - tofutim
我需要从对象中获取一些图形数据以绘制一些线条。 - catcall
2个回答

5

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

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

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


哦,DataContext作为Employee!那太简单了!非常感谢你!现在它可以工作了。 - catcall
很高兴能帮到您 :) (您可以通过点击答案左侧的勾选框来接受此答案) - H.B.
如何访问兄弟按钮,例如,当我点击当前按钮时,我需要清除先前按钮的样式? - Batur
@Batur:你应该事先在数据或XAML中使用绑定/引用将它们链接起来。 - H.B.

1
你应该能够遍历ItemsControl中的项并获取所需的所有属性。给ItemsControl起一个名字,这样你就可以在代码后台中引用它:
<ItemsControl Name="itemsControl" ... />

然后在代码后台

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

如果你需要一个具体的项,可以尝试使用CurrentItem或GetItemAt()。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接