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
?
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
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. –