我有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
对象?
答案 0 :(得分:1)
itemsSource.ItemContainerGenerator.ItemFromContainer
仅在您传递Item Container
时才有效,但不会传递它的视觉元素。因此,您需要找到包含Ellipse的ContentPresenter
,并将其作为参数传递给ItemFromContainer
方法。由于ItemsContainer
的{{1}}为ItemsControl
。
我看到的一种方式是由父母从ContentPresenter
开始,直到找到VisualHit
,并为该项目致电ContentPresenter
。试试这个,它应该工作。但是这里的问题可能是ContentPresenter可能存在于ItemsContainer的模板中,并且您将再次获得null。绝对通过将ItemFromContainer
转换为ItemsControl
将更容易找到ListBox
,但您必须重新设置它并删除不需要的其他功能。
同时尝试检查ListBoxItem
,我可能正是您想要的