2010-12-02 1 views
0

Ich verwende das SilverLight Toolkit zur Implementierung einiger Drag/Drop-Funktionen in einer Silverlight 4-Webanwendung. Meine Drag-Quelle ist eine Listbox, und ich habe achtzehn potenzielle Drop-Ziele. Ich muss zulassen/nicht erlauben fallenlassen basierend auf einem String-Wert für das gezogene Objekt.Ermitteln Sie im Code, ob ein Dragdrop-Drop mit dem Silverlight Toolkit zulässig ist

Ich habe kein Problem, den Vergleich zu machen und zu bestimmen, ob das Objekt auf dem Ziel fallen gelassen werden kann oder nicht, aber ich habe Probleme herauszufinden, was das beste Ereignis ist und wie man es nicht macht Akzeptiere den Tropfen.

Ich habe mir das DragEnter-Ereignis angeschaut, und das sieht nach dem besten Ort aus, um damit umzugehen, aber ich bin mir nicht ganz sicher, was ich tun muss, damit es nicht fällt. Hier ist ein Ausschnitt aus einem Teil des Codes, die ich versucht habe, aber es verhindert nicht den Tropfen:

 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 
       { 

       } 


      }; 

Antwort

0

Nun, ich war in der Nähe. Wie @James Manning in seiner Antwort sagte: "Ändere einfach die Effekte auf Keine ... sollte ausreichen."

Also, wahr, solange Sie es an der richtigen Stelle tun. Ich hatte meinen Code, um dies in der DragEnter Event-Handler behandeln, wenn es in der DragOver Event-Handler getan werden sollte. Ändern der Effekte in DragEnter sind wie Rainier Wolfcastles Radioactive Man Brille - sie tun nichts.

der Code Also, das funktioniert wie folgt dar:

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 
      { 

      } 


     }; 
1

nur die Auswirkungen auf Keine ändern (wie Sie tun) sollte genug sein - ist ein gutes Beispiel ein Teil des internen Code ist in der Baumansicht Drag Drop-Ziel im Toolkit selbst (SetEffects Methode)

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

+0

ich mit dem Code oben versucht, und es immer noch erlaubt den Tropfen. Ich überprüfe derzeit die Anwendbarkeit der Drop in der Drop-Ereignishandler, und das funktioniert jetzt gut. Ich werde dies noch einmal besprechen, wenn ich Zeit habe, und es erneut versuchen. Wenn es dann funktioniert, werde ich als richtig markieren. – Robaticus

+0

danke für Ihre Eingabe. Ich habe dich dafür beschuldigt, meinen Hintern in die richtige Richtung zu schieben. – Robaticus

Verwandte Themen