タイトルが混乱しすぎていないことを願っています。それを説明する方法が完全にはわかりませんでした. ともかく!
ここに示すように、階層型DataTemplatesを含むツリービューがあります。
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type WPFFM:AssetCategoryViewModel}" ItemsSource="{Binding Path= Children}" >
<StackPanel Orientation="Horizontal" AllowDrop="True" Drop="StackPanel_Drop" DragEnter="StackPanel_DragEnter">
<TextBlock Text= "{Binding Description}" ContextMenu="{StaticResource assetOverviewContextMenu}"/>
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type WPFFM:AssetViewModel}" ItemsSource="{Binding Children}" >
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" HorizontalAlignment="Stretch" ContextMenu="{StaticResource assetContextMenu}"
PreviewMouseLeftButtonDown="Asset_PreviewMouseLeftButtonDown" PreviewMouseMove="Asset_PreviewMouseMove" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
カテゴリ ヘッダーで AllowDrop を true に設定し、2 つの間でアセットをドラッグするための処理を設定しました。ドラッグのコードは次のとおりです。
private void Asset_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
startPoint = e.GetPosition(null);
}
private void Asset_PreviewMouseMove(object sender, MouseEventArgs e)
{
// Get the current mouse position
Point mousePos = e.GetPosition(null);
Vector diff = startPoint - mousePos;
if (e.LeftButton == MouseButtonState.Pressed &&
Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
{
TextBlock parentMenu = sender as TextBlock;
AssetViewModel assetViewModelToSend = ((AssetViewModel)parentMenu.DataContext);
// Initialize the drag & drop operation
DataObject dragData = new DataObject("myFormat", assetViewModelToSend);
DragDrop.DoDragDrop(parentMenu, dragData, DragDropEffects.Move);
}
}
そして落とします。
private void StackPanel_Drop(object sender, DragEventArgs e)
{
//TextBlock parentMenu = e as TextBlock;
//AssetCategoryViewModel assetCat = ((AssetCategoryViewModel)parentMenu.DataContext);
//MessageBox.Show(parentMenu.Text);
if (e.Data.GetDataPresent("myFormat"))
{
AssetViewModel modelBeingSent = e.Data.GetData("myFormat") as AssetViewModel;
MessageBox.Show(modelBeingSent.Description);
}
}
private void StackPanel_DragEnter(object sender, DragEventArgs e)
{
if (!e.Data.GetDataPresent("myFormat") ||
sender == e.Source)
{
e.Effects = DragDropEffects.None;
}
}
これは正常に動作し、dragEventArgs からビューモデルを取得してドラッグできますが、ドラッグ先の新しいカテゴリ ビューモデルを見つける必要がありますが、ドロップ ターゲット データを取得するにはどうすればよいですか? それはおそらく送信者または引数の何かですか?
編集:明確にするために、ここに私の見解の写真があります。ドラッグ ソースは子 (ラップトップ) で、ドロップ ターゲットはカテゴリ (ハードウェアなど) です。