在代码中确定是否允许使用Silverlight Toolkit进行拖放

时间:2010-12-02 15:17:49

标签: c# silverlight silverlight-4.0 silverlight-toolkit

我正在使用SilverLight Toolkit在Silverlight 4 Web应用程序中实现一些拖放功能。我的拖动源是一个列表框,我有十八个潜在的降落目标。我需要根据拖动对象上的字符串值允许/禁止删除。

我没有问题进行比较并确定是否允许将项目放在目标上,但是,我无法确定要处理的最佳事件,以及如何使其不接受下降。

我看过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 个答案:

答案 0 :(得分:1)

将效果更改为无(就像你正在做的那样)应该足够了 - 一个很好的例子是工具包本身的树视图拖放目标中的一些内部代码(SetEffects方法)

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

答案 1 :(得分:0)

嗯,我很亲密。正如@James Manning在他的回答中所说,“只需将效果改为无......就足够了。”

所以,的确如此,只要你在正确的地方做到这一点。我已经把我的代码放在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
          {

          }


      };