Перетаскивание пользовательского элемента управления не работает

54
4

Я создал собственный ListView чтобы позволить мне перетаскивать. с некоторой помощью от других вопросов и сообщений в блоге я получил это далеко.

Я использую MVVM в реализации UserControl но при создании фактического Custom ListView я просто использую код позади. как я думал, это будет проще.

Как я могу реализовать код ниже, чтобы добавить в ViewModel ICollection?

Обновить:

обратите внимание, что я думаю, что причина, по которой это происходит, заключается в том, что я пытаюсь добавить object ObservableCollection<person>();

исключение:

Операция недействительна во время использования ItemsSource. Вместо этого выберите и измените элементы с помощью ItemsControl.ItemsSource.

XAML: Реализация:

<controls:DragNDropListView 
x:Name="ListView"
ItemsSource="{Binding Persons}"
DragDropEffects="Copy"
DisplayMemberPath="Name"></controls:DragNDropListView>

<controls:DragNDropListView
x:Name="ListView1"
Grid.Column="1"
ItemsSource="{Binding Persons1}"
DisplayMemberPath="Name"
DragDropEffects="Copy"/>

ViewModel:

public class ViewModel 
{
public ViewModel()
{
Persons = new ObservableCollection<Person>();
Persons1 = new ObservableCollection<Person>();
Persons.Clear();
Persons1.Clear();
foreach (var person in Data.People().ToList())
{
Persons.Add(person);
Persons1.Add(person);
}

}
public ObservableCollection<Person> Persons { get; set; }
public ObservableCollection<Person> Persons1 { get; set; }
}

Код перетаскивания:

private void OnMouseMove(object sender, MouseEventArgs e)
{
Point mousePos = e.GetPosition(null);
Vector diff = _startPoint - mousePos;
if (e.LeftButton == MouseButtonState.Pressed &&
(Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance))
{
if (ListView != null)
{
ListViewItem listViewItem =
FindAnchestor<ListViewItem>((DependencyObject)e.OriginalSource);
if (listViewItem != null)
{
var item = ListView.ItemContainerGenerator.ItemFromContainer(listViewItem); //NOTE:this is an object not a Person like observeablecollection in ViewModel.
DataObject dragData = new DataObject("myFormat", item);
DragDrop.DoDragDrop(listViewItem, dragData, DragDropEffects);
}
}
}
}

Drop-код, который бросает исключение:

private void OnDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent("myFormat"))
{
var item = e.Data.GetData("myFormat");
if (item != null)
{
Items.Add(item);//this is where it throws exception
}
}
}

спросил(а) 2016-07-24T21:33:00+03:00 3 года, 11 месяцев назад
0
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема