使用gong-wpf将数据项添加到空的集合中

4
我正在使用wpf组件https://github.com/punker76/gong-wpf-dragdrop来实现拖放功能,但是我似乎无法将元素拖放到空集合中。如果我用一个元素初始化集合,则可以正常工作。
我还创建了自己的拖放处理程序以查看发生了什么,但是对于空集合,它永远不会被调用。有没有办法启用向空集合进行拖放?
示例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);
    }
}

以防万一,如果未来有人偶然遇到这个问题:无法将某些东西放入“ItemsControl”(例如“ListBox”),另一个潜在的原因是嵌套多个“ItemsControls”。 这样做可能会导致此错误:https://github.com/punker76/gong-wpf-dragdrop/issues/168。 - Hauke P.
1个回答

4

由于控件的透明背景和尺寸,似乎没有命中目标。

我刚刚在我的ItemsControl中添加了Padding="1" MinHeight="10" Background="White",现在即使集合为空,拖放也能正常工作了。

在我的示例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}" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接