【问题标题】:How to access ItemsControl's ItemsSource element from the ItemsControl's Item's code behind?如何从 ItemsControl 的 Item 后面的代码中访问 ItemsControl 的 ItemsSource 元素?
【发布时间】:2011-09-05 06:05:42
【问题描述】:

在我的主视图中,我有一个绑定到对象集合的 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,但它似乎并不是我们所需要的。

【问题讨论】:

  • 你想在后面的代码中做什么?
  • 我需要从对象中获取一些图形数据来绘制一些线条。

标签: wpf itemscontrol code-behind


【解决方案1】:

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

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

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

【讨论】:

  • 哦,DataContext 作为员工!那太简单了!太感谢了!现在可以了。
  • 很高兴有帮助 :) (您可以通过单击答案左侧的复选标记大纲来接受此答案)
  • 如何访问同级按钮,比如点击当前按钮需要清除上一个按钮样式?
  • @Batur:您应该事先使用绑定/引用将它们链接到您的数据或 XAML 中。
【解决方案2】:

您应该能够遍历 ItemsControl 中的项目并获得所需的所有属性。为 ItemsControl 命名,以便您可以在后面的代码中对其进行处理:

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

然后在代码后面

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 2010-11-03
    • 1970-01-01
    相关资源
    最近更新 更多