WPF MVVM Перетащите на другой элемент управления, чтобы вызвать только событие - PullRequest
0 голосов
/ 16 сентября 2009

У меня есть два ListBox с объектами в качестве ItemsSource, заполняющих их. Прямо сейчас я использую DragDropHelper, чтобы позволить мне перетащить объект из одного ListBox во второй ListBox. Я запускаю пользовательский код, чтобы изменить атрибут объекта и обновить мои две коллекции объектов ListBox.

Однако теперь я хочу иметь возможность перетаскивать один из этих объектов на другой элемент управления в окне. Но я не хочу обязательно «УБРАТЬ» объект. Я просто хочу, чтобы внешнее управление осознало (вызывая событие), что оно только что было сброшено объектом с идентификатором.

Напомним, у меня есть 2 списка. один список - «Избранное», другой - «Неизбранный». Я могу счастливо перетаскивать между двумя списками, и все работает. Теперь я хочу перетащить избранное / не избранное из списка и перенести его на другой элемент управления. Я хочу, чтобы этот элемент управления просто сказал: «ЭЙ! Мне только что бросили любимый / нелюбимый объект».

есть идеи?

1 Ответ

0 голосов
/ 29 июня 2010

Я сделал нечто похожее на этот в прошлом году (.NET .3.5).

Если я правильно помню, когда вы «отбрасываете» объект, который был выделен и перетащен (через слой «adorner»), вы по сути держите ссылку на выбранный объект. Когда этот объект «отброшен», обработчик события «InstanceDroppedOnUserControlFoo_Handler (... args)» имеет нетипизированную ссылку на удаленный объект.

Из этого вы можете разыграть (если тип известен) и получить доступ к полю Id для вашего сердца.

Вопрос теперь заключается в том, использует ли целевой пользовательский элемент управления для перетаскивания ту же ViewModel в своем DataContext, что и в Drag Source? Как и в большинстве случаев, когда это не так, вы не получите ссылку в аргументах события, вы получите ноль.

Если это так, вам необходимо изучить следующие варианты взаимодействия между ViewModel:

Использовать инфраструктуру передачи сообщений MVVM ( MVVM Light Framework см. Компонент Messenger ) или же Составные события Pub Sub через WPF Prism - EventAggregator :

Затем выполните этот процесс (или что-то более приспособленное к вашим потребностям):

  • Когда элемент выбран и перетаскивается, удерживайте его ссылку в свойстве ViewModel вашего Drag Source.
  • Когда элемент опущен, опубликуйте сообщение с надписью «Я хочу ссылку на выбранный элемент, который перетаскивался».
  • Источник перетаскивания может опубликовать сообщение в ответ со ссылкой на перетаскиваемый объект, который будет получен запрашивающей моделью представления.

Очевидно, что на этом этапе вы можете адаптировать справочную информацию к вашим потребностям. Я оставлю вас с одним последним предложением, возможно, стоит подумать об использовании класса контроллера, который управляет этим видом операций. Я видел контроллер, используемый Microsoft Patterns & Practices в координации с MVVM в образцах WPF CAG (PRISM) , так что это не случайно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...