2012-03-07 4 views
0

Мне нужно перетаскивать элементы между несколькими itemcontrols, каждый связан с собственной коллекцией , когда я перетаскиваю элемент, мне нужно знать, с какого элемента управления он изначально был вытащен.get itemscontrol reference from item

перетаскиваемый шаблона элемента:

<DataTemplate> 
     <Ellipse MouseDown="Ellipse_MouseDown" ></Ellipse> 
    </DataTemplate> 

в itemscontrols:

<ItemsControl Name="Pipe23" ItemsSource="{Binding Path=Pipes[23].Checkers}" ItemTemplate="{StaticResource PipeDataItem}"/> 
    <ItemsControl Name="Pipe22" ItemsSource="{Binding Path=Pipes[22].Checkers}" ItemTemplate="{StaticResource PipeDataItem}"/> 
    <ItemsControl Name="Pipe21" ItemsSource="{Binding Path=Pipes[21].Checkers}" ItemTemplate="{StaticResource PipeDataItem}"/> 
    <ItemsControl Name="Pipe20" ItemsSource="{Binding Path=Pipes[20].Checkers}" ItemTemplate="{StaticResource PipeDataItem}"/> 

при перетаскивании элемента на событие MouseDown я могу ссылаться на элемент тащат, но я также необходимо ссылаться на ItemsControl он был вытащен из: как это можно сделать?

private void Ellipse_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     Ellipse ellipse = (Ellipse)sender; 
     Checker checker = (Checker)ellipse.DataContext; 
     // how do i reference the itemsconrtol containing the current ellipse (item)  
    } 
+1

блог Рэйчел имеет большое решение, VisualTree хелперы HTTP: // rachel53461 .wordpress.com/ –

ответ

1

Я бы перемещаться вверх VisualTree, пока я не найти ItemsControl объект, и это будет родителем.

Я некоторые VisualTree helpers размещены на моем блоге, что делает это, и я мог бы использовать их, как это, чтобы найти родителей ItemsControl:

private void Ellipse_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    Ellipse ellipse = (Ellipse)sender; 
    Checker checker = (Checker)ellipse.DataContext; 

    ItemsControl parent = VisualTreeHelpers.FindAncestor<ItemsControl>(ellipse); 
} 
+0

:) спасибо i'm noob, не знал, как это сделать . –

+0

только одно: VisualTreeHelper не имеет FindAncestor i использовано VisualTreeHelper.GetParent (эллипс); , который возвращает что-то, называемое ContentPresenter. –

+0

@eranotzer Добавьте 's' в конец этого. Я назвал его «VisualTreeHelpers», прежде чем понял, что уже существует класс под названием «VisualTreeHelper». Вы также можете переименовать класс в другое. – Rachel