2017-12-06 5 views
-1

私はあるリストから別のリストにドラッグできるアプリケーションを作成していますが、同じリストからドラッグすることもできます。とにかく、どのリストがソースリスト(どのリストをドラッグしたのか)、または何のデータをドラッグしたのかを知ることができますか? 私は2つのリストを持っています:lbTwoとlbOneと、2つのデータ(ObservableCollectionの各リストに1つずつ):firstDataTypeとsecondDataType。 私は、データを取得するために見つけた唯一の方法である(しかし、私はリスト名ではなく、それに含まれるデータを取得することを好む):WPFでリストボックス名またはtypeOfオブジェクトを検索するC#ドラッグ&ドロップ

private void ListBox_Drop(object sender, DragEventArgs e) 
{ 
      ListBox parent = (ListBox)sender; 

      string data_type = (e.Data.GetFormats())[0]; 
} 

が、それは本当にエレガントではないと私はまた、全体の名前(MyApp]を取得します。 firstDataType)。

ありがとうございます!ここで

+0

悪いアドバイス - しかし、XAMLでの名前を追加両方のリストボックス、次にControl.Nameのコードテストを実行します。 –

+0

私はすでにlistBoxesの名前を与えました...しかし、Control.Nameのオプションはありません...(そのような変数はありません) – Ben

+0

Control.Nameによる - 私の意図したもの - 上記のコードではparent.Nameになります。 –

答えて

0

は私のコードがどのように見えるかです:

XAML:

<ListBox Name="LeftBox" Grid.Column="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
      PreviewMouseLeftButtonDown="Common_PreviewMouseLeftButtonDown" 
      AllowDrop="True" 
      Drop="Common_Drop"/> 
    <ListBox Name="RightBox" Grid.Column="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
      PreviewMouseLeftButtonDown="Common_PreviewMouseLeftButtonDown" 
      AllowDrop="True" 
      Drop="Common_Drop"/> 

私は私のリストボックスにテストデータをロードするために、このメソッドを呼び出します。

private void LoadData() 
    { 
     var lstbox1Data = new string[] { "One", "Two", "Three", "Four", "Five" }; 
     var lstbox2Data = new string[] { "Alpha", "Beta", "Theta", "Gamma", "Phi" }; 

     foreach (var item in lstbox1Data) 
     { 
      LeftBox.Items.Add(item); 
     } 

     foreach (var item in lstbox2Data) 
     { 
      RightBox.Items.Add(item); 
     } 
    }   

これは、実際の実装でありますリストボックス間でDragDrop &リストボックス内で再配置します。私はクラス以下へのデータ&送信者を包ん

private void Common_Drop(object sender, DragEventArgs e) 
    { 
     var destLisBox = sender as ListBox; 
     var dragDropData = e.Data.GetData(typeof(DragDropData)) as DragDropData; 

     if (dragDropData != null) 
     { 
      var dataWhereToInsert = GetDataFromListBox(destLisBox, e.GetPosition(destLisBox)); 

      if (dataWhereToInsert != null) 
      { 
       var insertAtIndex = destLisBox.Items.IndexOf(dataWhereToInsert); 
       if (insertAtIndex >= 0) 
       { 
        dragDropData.DragStartSource.Items.Remove(dragDropData.ActualData); 
        destLisBox.Items.Insert(insertAtIndex, dragDropData.ActualData); 
       } 
      } 
      else 
      { 
       dragDropData.DragStartSource.Items.Remove(dragDropData.ActualData); 
       destLisBox.Items.Add(dragDropData.ActualData); 
      } 
     } 
    } 

    private static object GetDataFromListBox(ListBox source, Point point) 
    { 
     UIElement element = source.InputHitTest(point) as UIElement; 
     if (element != null) 
     { 
      object data = DependencyProperty.UnsetValue; 
      while (data == DependencyProperty.UnsetValue) 
      { 
       data = source.ItemContainerGenerator.ItemFromContainer(element); 
       if (data == DependencyProperty.UnsetValue) 
       { 
        element = VisualTreeHelper.GetParent(element) as UIElement; 
       } 
       if (element == source) 
       { 
        return null; 
       } 
      } 
      if (data != DependencyProperty.UnsetValue) 
      { 
       return data; 
      } 
     } 
     return null; 
    } 

    private void Common_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     var srcListBox = sender as ListBox; 
     if (srcListBox != null) 
     { 
      var data = GetDataFromListBox(srcListBox, e.GetPosition(srcListBox)); 

      if (data != null) 
      { 
       var dragDropData = new DragDropData 
       { 
        ActualData = data, 
        DragStartSource = srcListBox 
       }; 

       DragDrop.DoDragDrop(srcListBox, dragDropData, DragDropEffects.Move); 
      } 
     } 
    } 

注:

public class DragDropData 
{ 
    public object ActualData { get; set; } 
    public ListBox DragStartSource { get; set; } 
} 

素晴らしい:GetDataFromListBox方法は、から来ている: [http://www.c-sharpcorner.com/uploadfile/dpatra/drag-and-drop-item-in-listbox-in-wpf/]

+0

ありがとう、それはうまく動作します! ビジュアルインジケータを追加すると、どのように表示されるのかわかりますか? – Ben

+0

@Ben - 私はこれをやっている経験がありません - これが助けになるかもしれません:https://blogs.msdn.microsoft.com/jaimer/2007/07/12/drag-amp-drop-in-wpf-explained-エンドツーエンド/ –

+0

ありがとう!!できます :) – Ben

関連する問題