2012-11-29 1 views
0

J'ai un ItemsControl lié à une liste, MyItems, avec des objets de SomeType. Lorsque je clique sur mes éléments d'interface utilisateur (i.e. ellipses), je veux obtenir l'objet SomeType.L'élément lié aux tests Hit est-il dans ItemsControl?

Cela ne PAS travail:

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)); 
} 

Voici le 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> 

Comment puis-je trouver l'objet SomeType?

Répondre

1

itemsSource.ItemContainerGenerator.ItemFromContainer ne fonctionnera que si vous passez Item Container, mais pas les éléments visuels de celui-ci. Vous devez donc trouver ContentPresenter qui contient l'Ellipse, et passer cela comme argument à la méthode ItemFromContainer. Puisque ItemsContainer pour ItemsControl est ContentPresenter.

Une façon que je vois, est de remonter par les parents de VisualHit, jusqu'à ce que vous trouviez ContentPresenter, et appelez ItemFromContainer pour cet article. Essayez ceci, ça devrait marcher. Mais le problème ici pourrait être que ContentPresenter peut exister dans le modèle de ItemsContainer, et vous obtiendrez encore zéro. Certainement en chantant ItemsControl à ListBox va rendre plus facile de trouver ListBoxItem, mais vous devrez le re-style et supprimer les fonctionnalités supplémentaires dont vous n'avez pas besoin.

Essayez aussi de vérifier Ellipse.DataContext, je pourrais être exactement ce que vous voulez

+0

Serait-il une bonne solution pour marquer réellement l'Ellipse avec l'objet? 'Tag =" {Binding} "' Cela fonctionne également, mais je ne sais pas si c'est mieux ou pire que votre solution. – l33t

+1

Avez-vous essayé de vérifier DataContext? il devrait déjà contenir un élément, sinon, je ferais mieux de lier DataContext au lieu de Tag. Id cela fonctionne, c'est mieux que l'étiquette et la première solution que je suggère. –

Questions connexes