0

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

不起作用

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对象?

4

1 回答 1

1

itemsSource.ItemContainerGenerator.ItemFromContainer仅当您通过时才有效Item Container,但它的视觉元素无效。所以你需要找到ContentPresenter包含椭圆的那个,并将它作为参数传递给ItemFromContainer方法。因为ItemsContainerforItemsControlContentPresenter.

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

也试着检查一下Ellipse.DataContext,我可能正是你想要的

于 2012-11-29T13:18:19.670 回答