Поиск выбранного элемента в ItemsControl при запуске PreviewMouseLeftButtonDownCommand RelayCommand \ EventToCommand - PullRequest
1 голос
/ 09 августа 2011

Мое приложение - wpf mvvm, использующее привязки RelayCommand \ EventToCommand для событий.Мое приложение выполняет обычное перетаскивание из ListBox на ItemsControl (на самом деле это элемент управления изображением с ItemsControl вверху, который удерживает перетаскиваемые элементы).ListBox заполняется коллекцией vm ObservableCollection.И ItemsControl - это также ObservableCollection, в который я вставляю удаленные элементы MyObj.

Когда я перетаскиваю элементы из ListBox и помещаю их в \ on в ItemsControl \ image, все это работает нормально.В PreviewMouseLeftButtonDownCommand я использую System.Windows.Media.VisualTreeHelper для рекурсивного обхода визуального дерева, поэтому при перетаскивании из ListBox я могу найти перетаскиваемый элемент MyObj.Но когда я пытаюсь перетащить элемент из ItemsControl, код не работает.Все, что я могу вернуть, - это преобразование элемента DataTemplate (ярлык).Итак, мой вопрос:как получить выбранный элемент из моего ItemsControl, когда срабатывает RelayCommand \ EventToCommand PreviewMouseLeftButtonDownCommand?

виртуальная машина C #:

PreviewMouseLeftButtonDownCommand = new RelayCommand<MouseButtonEventArgs>(e =>
{
    if (e.Source is ListBox)
    {
    // get dragged list box item
    ListBox listBox = e.Source as ListBox;
    ListBoxItem listBoxItem = VisualHelper.FindAncestor<ListBoxItem>((DependencyObject)e.OriginalSource);

    // Find the data behind the listBoxItem
    if (listBox == null || listBoxItem == null) return;

    MyObj tag = (MyObj)listBox.ItemContainerGenerator.ItemFromContainer(listBoxItem);

     // Initialize the drag & drop operation
    DataObject dragData = new DataObject("myObj", tag);
    DragDrop.DoDragDrop(listBoxItem, dragData, DragDropEffects.Move);
}
else if (e.Source is ItemsControl)
{
    ItemsControl itemsControl = e.Source as ItemsControl;
    object item = VisualHelper.FindAncestor<UIElement>((DependencyObject)e.OriginalSource);

    if (itemsControl == null || item == null) return;

    MyObj tag = (MyObj)itemsControl.ItemContainerGenerator.ItemFromContainer(item);


    // Initialize the drag & drop operation
    DataObject dragData = new DataObject("myObj", tagDragging);
    DragDrop.DoDragDrop(item, dragData, DragDropEffects.Move);
    }
});

1 Ответ

2 голосов
/ 11 августа 2011

Вот код, который я использовал в прошлом:

private void DragSource_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    // Get ItemsControl for object being dragged
    if (sender is ItemsControl)
        _sourceItemsControl = sender as ItemsControl;
    else if (sender is Panel)
        _sourceItemsControl = WPFHelpers.FindAncester<ItemsControl>(sender as Panel);

    // Get ItemContainer for object being dragged
    FrameworkElement sourceItemsContainer = _sourceItemsControl
        .ContainerFromElement((Visual)e.OriginalSource) as FrameworkElement;

    // Get data object for object being dragged
    if (sourceItemsContainer == null)
        _draggedObject = _sourceItemsControl.DataContext;
    else if (sourceItemsContainer == e.Source)
        _draggedObject = e.Source;
    else
        _draggedObject = sourceItemsContainer.DataContext;

}

Класс помощника WPF

public class WPFHelpers
{
    public static T FindAncester<T>(DependencyObject current)
    where T : DependencyObject
    {
        current = VisualTreeHelper.GetParent(current);

        while (current != null)
        {
            if (current is T)
            {
                return (T)current;
            }
            current = VisualTreeHelper.GetParent(current);
        };
        return null;
    }
}
...