点击ItemsControl中的测试绑定项?

时间:2012-11-29 13:09:25

标签: wpf xaml hittest

我有ItemsControl绑定到列表MyItems,对象为SomeType。当我点击我的UI元素(即省略号)时,我想要抓住SomeType对象。

NOT 工作:

public HitTestResultBehavior SomeTypeHitCallback(HitTestResult result)
{
    if (result.VisualHit is Ellipse)
    {
        var ellipse = result.VisualHit as Ellipse;

        // Does not work...
        object item = itemsSource.ItemContainerGenerator.ItemFromContainer(ellipse);
        // item now equals DependencyProperty.UnsetValue

        // Here I want to change the property of the object
        // associated with the Ellipse...
        var o = item as SomeType;
        o.IsSelected = !o.IsSelected;

        return HitTestResultBehavior.Continue;
    }

    return HitTestResultBehavior.Stop;
}

private void Canvas_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    var pt = e.GetPosition((UIElement)sender);
    VisualTreeHelper.HitTest(
        (UIElement)sender,
        null,
        new HitTestResultCallback(SomeTypeHitCallback),
        new PointHitTestParameters(pt));
}

这是XAML:

<ItemsControl x:Name="itemsSource" ItemsSource="{Binding Path=MyItems}">
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <Canvas ClipToBounds="True" PreviewMouseLeftButtonDown="Canvas_PreviewMouseLeftButtonDown" />
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <Ellipse x:Name="item" Width="{Binding Width}" Height="{Binding Height}" />
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

如何找到SomeType对象?

1 个答案:

答案 0 :(得分:1)

itemsSource.ItemContainerGenerator.ItemFromContainer仅在您传递Item Container时才有效,但不会传递它的视觉元素。因此,您需要找到包含Ellipse的ContentPresenter,并将其作为参数传递给ItemFromContainer方法。由于ItemsContainer的{​​{1}}为ItemsControl

我看到的一种方式是由父母从ContentPresenter开始,直到找到VisualHit,并为该项目致电ContentPresenter。试试这个,它应该工作。但是这里的问题可能是ContentPresenter可能存在于ItemsContainer的模板中,并且您将再次获得null。绝对通过将ItemFromContainer转换为ItemsControl将更容易找到ListBox,但您必须重新设置它并删除不需要的其他功能。

同时尝试检查ListBoxItem,我可能正是您想要的