Определите в коде, разрешить ли перетаскивание с помощью набора инструментов Silverlight - PullRequest
0 голосов
/ 02 декабря 2010

Я использую набор инструментов SilverLight для реализации некоторых функций перетаскивания в веб-приложении Silverlight 4. Мой источник перетаскивания - это список, и у меня есть восемнадцать потенциальных целей перетаскивания. Мне нужно разрешить / запретить удаление, основываясь на строковом значении перетаскиваемого объекта.

У меня нет проблем с проведением сравнения и определением, разрешено ли выбрасывание предмета на цель, однако у меня возникают проблемы с выяснением, какое событие лучше всего обрабатывать, и как заставить его не принимать падение.

Я посмотрел на событие DragEnter, и это выглядит как лучшее место, чтобы справиться с этим, но я не совсем уверен, что мне нужно сделать, чтобы оно не упало. Вот фрагмент кода, который я пробовал, но он не предотвращает падение:

      lbDragDrop.DragEnter += (src, e) =>
          {
              VaultSocketViewModel vm = this.DataContext as VaultSocketViewModel;

              ListBoxDragDropTarget target = src as ListBoxDragDropTarget;

              ObservableCollection<ItemModel> listBoxBinding = vm.Slots[target.Name];

              object data = e.Data.GetData(e.Data.GetFormats()[0]);

              ItemDragEventArgs eventArgs = data as ItemDragEventArgs;
              SelectionCollection coll = eventArgs.Data as SelectionCollection;


              ItemModel newItem = coll.Select(t => t.Item).OfType<ItemModel>().FirstOrDefault();

              if (!target.Name.StartsWith(newItem.ItemSlot))  // don't allow drop
              {
                  e.Effects = Microsoft.Windows.DragDropEffects.None;
                  e.Handled = true;
              }
              else
              {

              }


          };

Ответы [ 2 ]

1 голос
/ 04 декабря 2010

достаточно просто поменять эффекты на None (как вы делаете) - хорошим примером является некоторый внутренний код в цели перетаскивания в виде дерева в самом наборе инструментов (метод SetEffects)

http://silverlight.codeplex.com/SourceControl/changeset/view/57505#779753

0 голосов
/ 12 декабря 2010

Ну, я был близко. Как сказал @James Manning в своем ответе, «просто измените эффекты на None ... должно быть достаточно».

Итак, правда, если вы делаете это в нужном месте. Я поместил свой код для обработки этого в обработчик событий DragEnter, когда это должно было быть сделано в обработчике событий DragOver. Изменение эффектов в DragEnter похоже на очки радиоактивного человека Рейнира Вольфкасла - они ничего не делают.

Итак, код, который работает следующим образом:

 lbDragDrop.DragOver += (src, e) =>
      {
          VaultSocketViewModel vm = this.DataContext as VaultSocketViewModel;

          ListBoxDragDropTarget target = src as ListBoxDragDropTarget;

          ObservableCollection<ItemModel> listBoxBinding = vm.Slots[target.Name];

          object data = e.Data.GetData(e.Data.GetFormats()[0]);

          ItemDragEventArgs eventArgs = data as ItemDragEventArgs;
          SelectionCollection coll = eventArgs.Data as SelectionCollection;


          ItemModel newItem = coll.Select(t => t.Item).OfType<ItemModel>().FirstOrDefault();

          if (!target.Name.StartsWith(newItem.ItemSlot))  // don't allow drop
          {
              e.Effects = Microsoft.Windows.DragDropEffects.None;
              e.Handled = true;
          }
          else
          {

          }


      };
...