2017-03-02 53 views
0

讓我說我的WPF應用程序有兩個ObservableCollection。對不同類型的observablecollection的gong-wpf-dragdrop

我需要拖動類型的一個列表「模塊」

ObservableCollection<IModuleInfo> Modules 

成類型的列表「任務」

ObservableCollection<TaskInfo> Tasks 

模塊是否被丟棄到任務列表中,我會做首先將模塊轉換爲任務,然後將新任務添加到列表中。

我用gong-wpf-dragdrop,默認的裝飾者很好。 我該怎麼做?在別處找不到解決方案。

<ItemsControl Grid.Row="1" ItemsSource="{Binding Modules}" 
dd:DragDrop.IsDragSource="True" 
dd:DragDrop.IsDropTarget="False" 
dd:DragDrop.UseDefaultDragAdorner="True"> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
    <UniformGrid Columns="1" /> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
    <Grid Margin="5"> 
    </Grid> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate>      
</ItemsControl> 

放置目標將是:

<ItemsControl Grid.Row="1" Margin="0,0,0,0"               dd:DragDrop.IsDragSource="False" 
dd:DragDrop.IsDropTarget="True"             dd:DragDrop.UseDefaultDragAdorner="True" 
dd:DragDrop.DropHandler="{Binding}"          
ItemsSource="{Binding Tasks}" 
> 

    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
    <StackPanel Orientation="Vertical" /> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
    <Grid> </Grid> 
</ItemsControl> 

我已經實現了對下降目標視圖模型,

,但它似乎像

public void Drop(IDropInfo dropInfo) 
    { 

不會接受放下不同類型的對象。

回答

0

當你實現IDropTarget接口時,它也需要一個DragOver方法以及Drop方法。以下是您可以根據dropInfo.DatadropInfo.SourceCollectiondropInfo.TargetCollection檢查類型的位置。這是事實,你將不再獲得裝飾器免費的,但它可以很容易地實現:

public void DragOver(IDropInfo dropInfo) 
{ 
    if(dropInfo.Data.GetType() == typeof(MyType)) 
    { 
     dropInfo.DropTargetAdorner = DropTargetAdorners.Insert; 
     dropInfo.Effects = DragDropEffects.Copy; 
    } 
} 

在此之後,你會處理轉換和除目標集合中的Drop方法。請注意,這種方法假定您不是一次拖動多個項目,在這種情況下,您需要執行不同的類型檢查,但裝飾器將相同。