2015-04-17 21 views
1

我正在使用wpf組件https://github.com/punker76/gong-wpf-dragdrop 以進行拖放操作,但似乎無法放入空集合中。如果我用一個元素初始化集合,它會起作用。使用gong-wpf進入空集合

我也創建了我自己的drop處理程序來查看會發生什麼,但它永遠不會被調用爲空集合。有什麼辦法可以放入空集合嗎?

樣品XAML:

<UserControl.Resources> 
    <wf:MyDefaultDropHandler x:Key="myDND" />         

    <HierarchicalDataTemplate ItemsSource="{Binding Instructions}" DataType="{x:Type wf:WhileBlock}"> 
     <TextBlock Text="While" /> 
    </HierarchicalDataTemplate> 

    <DataTemplate DataType="{x:Type wf:InstructionsList}"> 
     <ItemsControl ItemsSource="{Binding}" 
         dd:DragDrop.IsDragSource="True" 
         dd:DragDrop.IsDropTarget="True" 
         dd:DragDrop.UseDefaultDragAdorner="True" 
         dd:DragDrop.DropHandler="{StaticResource myDND}" /> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type wf:IfElseBlock}"> 
     <StackPanel> 
      <TextBlock Text="If" /> 
      <ContentControl Content="{Binding IfInstructions}" /> 
      <TextBlock Text="Else" /> 
      <ContentControl Content="{Binding ElseInstructions}" /> 
     </StackPanel> 
    </DataTemplate> 
</UserControl.Resources> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="100" /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 

    <Border Grid.Column="0"> 
     <ContentControl Content="{Binding AvailableComponents}" /> 
    </Border> 
    <Border Grid.Column="1" 
      dd:DragDrop.IsDropTarget="True" 
      dd:DragDrop.DropHandler="{StaticResource myDND}"> 
     <ContentControl Content="{Binding Instructions}" /> 
    </Border> 
</Grid> 

我的視圖模型。如果我取消註釋行//Instructions.Add(new IfElseBlock());降按預期工作

public abstract class AInstruction 
{ 
} 

public abstract class ACondition 
{ 
} 

public class InstructionsList : ObservableCollection<AInstruction> 
{ 

} 

public class WhileBlock : AInstruction 
{ 
    private readonly InstructionsList _instructions = new InstructionsList(); 

    public ACondition ExecuteIf { get; set; } 
    public InstructionsList Instructions { get { return _instructions; } } 
} 

public class IfElseBlock : AInstruction 
{ 
    private readonly InstructionsList _ifInstructions = new InstructionsList(); 
    private readonly InstructionsList _elseInstructions = new InstructionsList(); 

    public ACondition Condition { get; set; } 

    public InstructionsList IfInstructions { get { return _ifInstructions; } } 
    public InstructionsList ElseInstructions { get { return _elseInstructions; } } 
} 

public class Script 
{ 
    private readonly InstructionsList _instructions = new InstructionsList(); 
    private readonly InstructionsList _availableComponents = new InstructionsList(); 

    public Script() 
    { 
     AvailableComponents.Add(new IfElseBlock()); 
     AvailableComponents.Add(new IfElseBlock()); 
     AvailableComponents.Add(new IfElseBlock()); 
     AvailableComponents.Add(new WhileBlock()); 
     AvailableComponents.Add(new WhileBlock()); 
     AvailableComponents.Add(new WhileBlock()); 

     //Instructions.Add(new IfElseBlock()); 
    } 

    public InstructionsList Instructions { get { return _instructions; } } 

    public InstructionsList AvailableComponents { get { return _availableComponents; } } 
} 

我的處理程序,只是做一些調試

public class MyDefaultDropHandler : DefaultDropHandler 
{ 
    public override void DragOver(IDropInfo dropInfo) 
    { 
     Debug.WriteLine("DragOver " + dropInfo.TargetItem); 
     base.DragOver(dropInfo); 
    } 

    public override void Drop(IDropInfo dropInfo) 
    { 
     Debug.WriteLine("Drop  " + dropInfo.TargetItem); 
     base.Drop(dropInfo); 
    } 
} 
+0

萬一有人絆倒在未來這樣一個問題:另一個潛在原因無法不能夠的東西放到一個'ItemsControl'的(例如'ListBox')將多個'ItemsControls'嵌套在一起時就會出現。這樣做會導致這個錯誤:https://github.com/punker76/gong-wpf-dragdrop/issues/168 –

回答

0

似乎沒有擊中目標,因爲的透明背景和控件的大小。

我剛剛將Padding="1" MinHeight="10" Background="White"添加到我的ItemsControl中,現在拖放作品爲空集合。

在我的示例XAML它應該是這樣的:

<ItemsControl ItemsSource="{Binding}" Padding="1" BorderThickness="5,0,0,0" 
         MinHeight="10" 
         Background="White" 
         dd:DragDrop.IsDragSource="True" 
         dd:DragDrop.IsDropTarget="True" 
         dd:DragDrop.UseDefaultDragAdorner="True" 
         dd:DragDrop.DropHandler="{StaticResource myDND}" />