2011-01-31 4 views
2

ListBoxDragDropTarget(Silverlightツールキットの)内にラップされたListboxを使用しています。 このListBoxは、ユーザーが手動で並べ替えることができます。ただし、最後の項目は常にListBoxの下部にある必要があり、まったく移動することはできません。この最後のアイテムの移動をキャンセルする方法を見つけましたが、別のアイテムをドラッグ&ドロップすると、の下のが移動します。しかし、これが唯一のドラッグ操作の前に私にインデックスを与えるリストボックスのドラッグ・リオーダ:ドロップされたアイテムのインデックス

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

ItemDragEventArgs dragEventArgs = data as ItemDragEventArgs; 
SelectionCollection selectionCollection = dragEventArgs.Data as SelectionCollection; 
if (selectionCollection != null) 
{ 
    MyClass cw = selectionCollection[0].Item as MyClass; 
    int idx = selectionCollection[0].Index.Value; 
} 

私は、リストボックスのDropイベントにこのコードを使用してドラッグしたアイテムのインデックスを見つけることができます。

私の質問は次のとおりです:新しい落としたアイテムのインデックスを知る方法はありますか?このようにして、インデックス=リストの最後の位置なら、私はそれをforelastの位置に移動できます。

ありがとうございます!

答えて

4

私はこれを行う方法を見つけました。私はListBoxDragDropTargetItemDragCompletedイベントをバインドし、次のように行った:

private void dropTarget1_ItemDragCompleted(object sender, ItemDragEventArgs e) 
{ 
    var tmp = (e.DragSource as ListBox).ItemsSource.Cast<MyClass>().ToList(); 

    SelectionCollection selectionCollection = e.Data as SelectionCollection; 
    if (selectionCollection != null) 
    { 
     MyClass cw = selectionCollection[0].Item as MyClass; 

     int idx = tmp.IndexOf(cw); 
     if (idx == tmp.Count - 1) 
     { 
      tmp.Remove(cw); 
      tmp.Insert(tmp.Count - 1, cw); 

      MyListBox.ItemsSource = new ObservableCollection<MyClass>(tmp); 
     } 
} 

}

DragSourceのは、項目の新しい「配置」で、リストボックスを表したよう項目がある場合、私はので、チェックすることができます現在は最後に位置し、この場合は移動します。

残っている唯一の問題は、アイテムがドロップされて移動したために画面にちらつきが発生することです。

私は他の(最高の)提案にまだ開いています。

2

私はまったく同じ問題を抱えています。私はListBox内のアイテムの長方形をループして参照することが可能かもしれないと思う。var point = args.GetPosition(myListBox);が含まれています。しかし、私はより簡単な方法を望んでいます...

編集:この問題は、銀河に既に組み込まれている重力の効果を得ることはありません上記の半分と下の半分長方形を使用してリストにドロップします。

+0

こんにちはシェーン。それはまさに私が頑張ったものです。別の解決策を見つける方が良いでしょうが、誰にも「より良い」答えがない場合は、このことを念頭に置いておきます。ありがとう;-) +1 – Shimrod

+0

ブリリアント。答えをありがとう。それは私が必要なもののために働いた! – shane

+0

喜んで私は助けることができました:-) – Shimrod

関連する問題