Gong Solutions拖放+使用ItemsControl +查询

时间:2013-09-02 06:39:03

标签: wpf drag-and-drop

我正在使用随Gong解决方案拖放库提供的示例应用程序。 该解决方案包括具有itemssource和displaymemberpath set的列表框。 我已经修改了应用程序以包含itemscontrol和itemTemplate。 但解决方案不再适用。 DragInfo.cs文件中有一个例外。 不确定在此处发布是否正确。 但有人可以帮我这个。示例代码非常基本。

<ItemsControl 
        dragDropFramework:DragDrop.IsDragSource="True"
        Grid.Column="0" ItemsSource="{Binding Pupils}">            
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Label Content="{Binding FullName}" BorderBrush="Brown" BorderThickness="2"  Margin="2"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

<ItemsControl ItemsSource="{Binding Schools}"
        dragDropFramework:DragDrop.DropHandler="{Binding}"
        dragDropFramework:DragDrop.IsDropTarget="True"
        Grid.Column="1">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Label Content="{Binding Name}" BorderBrush="Brown" BorderThickness="2"  Margin="2"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

class PupilViewModel
{
    public string FullName { get; set; }
}

internal class WindowViewModel : IDropTarget
{
    public ICollectionView Schools { get; private set; }
    public ICollectionView Pupils { get; private set; }

    public SideWindowViewModel()
    {
        var pupils = new ObservableCollection<PupilViewModel>
            {
                new PupilViewModel { FullName = "Alex Thompson" },
                new PupilViewModel { FullName = "Tabitha Smith" },
                new PupilViewModel { FullName = "Carl Pederson" },
                new PupilViewModel { FullName = "Sarah Jones" },
                new PupilViewModel { FullName = "Paul Lowcroft" }
            };

        this.Pupils = CollectionViewSource.GetDefaultView(pupils);
        var schools = new SchoolViewModel { Name = "FirstSchool", Pupils = new ObservableCollection<PupilViewModel>() };
        this.Schools = CollectionViewSource.GetDefaultView(schools);
    }

    public void DragOver(DropInfo dropInfo)
    {
        if (dropInfo.Data is PupilViewModel)// && dropInfo.TargetItem is SchoolViewModel)
        {
            dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight;
            dropInfo.Effects = DragDropEffects.Move;
        }
    }

    public void Drop(DropInfo dropInfo)
    {
        throw new NotImplementedException();
    }

Window的dataContext设置为WindowViewModel的一个实例。 此代码自带的Gong库也作为代码项目的一部分。 http://www.codeproject.com/Articles/43614/Drag-and-Drop-in-WPF

原始代码看起来像这样

<ListBox Grid.Column="1" ItemsSource="{Binding Schools.CurrentItem.Pupils}" DisplayMemberPath="FullName"
             dd:DragDrop.IsDragSource="True" dd:DragDrop.IsDropTarget="True"/>

1 个答案:

答案 0 :(得分:2)

如果您还没有想出这个 - 看起来您已经注释了它检查的位置,以查看您拖动的东西是否是SchoolView。由于您正在使用DropTargetAdorners.Highlight,因此它会尝试突出显示您要拖动的内容。因为没有任何东西你得到空引用错误。那么也许回到这个?

public void DragOver(DropInfo dropInfo)
{
    if (dropInfo.Data is PupilViewModel) && dropInfo.TargetItem is SchoolViewModel)
    {
        dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight;
        dropInfo.Effects = DragDropEffects.Move;
    }
}