在ListView中重新排序项目时崩溃(使用XAML的Windows应用商店应用程序)

在ListView中重新排序项目时崩溃(使用XAML的Windows应用商店应用程序),xaml,windows-store-apps,observablecollection,Xaml,Windows Store Apps,Observablecollection,我有一个应用程序,它使用绑定到ObservableCollections的嵌套列表视图。父列表视图用于对项目进行分组,每个组包含一个项目列表视图。我使用ListView和ObservableCollections是因为我希望用户能够对组进行重新排序,也可以对组内的项目进行重新排序。我不需要它们在组之间移动项目,尽管我以后可能会尝试。(: 问题是,在你对一个组重新排序后,如果你尝试将一个项目从重新排序的组拖到另一个组,应用程序将在Windows.UI.XML.dll中崩溃,我一辈子都不知道如何防止

我有一个应用程序,它使用绑定到ObservableCollections的嵌套列表视图。父列表视图用于对项目进行分组,每个组包含一个项目列表视图。我使用ListView和ObservableCollections是因为我希望用户能够对组进行重新排序,也可以对组内的项目进行重新排序。我不需要它们在组之间移动项目,尽管我以后可能会尝试。(:

问题是,在你对一个组重新排序后,如果你尝试将一个项目从重新排序的组拖到另一个组,应用程序将在Windows.UI.XML.dll中崩溃,我一辈子都不知道如何防止它。我不希望人们这样做,但如果他们尝试,我也需要它不会崩溃

我可以用一个非常轻量级的应用程序复制这个

这是具有ObservableCollections的类:

public class GroupList
{
    public ObservableCollection<Group> Groups { get; set; }

    public GroupList()
    {
        Groups = new ObservableCollection<Group>();

        Group group1 = new Group("Group 1");
        group1.Items.Add(new Item("Item 1"));
        group1.Items.Add(new Item("Item 2"));
        group1.Items.Add(new Item("Item 3"));
        Groups.Add(group1);

        Group group2 = new Group("Group 2");
        group2.Items.Add(new Item("Item 4"));
        group2.Items.Add(new Item("Item 5"));
        group2.Items.Add(new Item("Item 6"));
        Groups.Add(group2);

        Group group3 = new Group("Group 3");
        group3.Items.Add(new Item("Item 7"));
        group3.Items.Add(new Item("Item 8"));
        group3.Items.Add(new Item("Item 9"));
        Groups.Add(group3);
    }
}

public class Group
{
    public string GroupName { get; set; }
    public ObservableCollection<Item> Items { get; set; }

    public Group(string groupName)
    {
        this.GroupName = groupName;
        this.Items = new ObservableCollection<Item>();
    }
}

public class Item
{
    public event PropertyChangedEventHandler PropertyChanged = null;
    public string ItemName { get; set; }

    public Item(string itemName)
    {
        this.ItemName = itemName;
    }
}
复制此问题:
1.运行应用程序
2.在组2和组3之间拖放组1
3.将项目1从组1拖到组2上

你应该看到一个撞击

我已经花了几个小时尝试不同的方法来防止这种情况发生。最近我遇到的是处理Drop事件并设置Handled=true,但是如果你将它放到一个组头上,它仍然会崩溃。如果有人能帮我解决这个问题,我将不胜感激

谢谢,


Todd

请在调试器中运行它,并公布引发的异常。如果它是本机异常,则可能需要使用混合调试器运行它。该异常是NullReferenceException(“对象引用未设置为对象的实例”)NullReferenceException似乎来自Windows.UI.XAML.ni.dll DirectUI::ListViewBase.GetDraggedItems中的GetDraggedItems。
<Grid Background="White">
    <ListView Name="groupListView" ItemsSource="{Binding}" CanDragItems="True" CanReorderItems="True" AllowDrop="True" IsSwipeEnabled="True" SelectionMode="None">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <Border BorderBrush="Black" BorderThickness="1">
                        <TextBlock Foreground="Red" Text="{Binding GroupName}"/>
                    </Border>
                    <ListView Name="itemListView" ItemsSource="{Binding Items}" CanDragItems="True" CanReorderItems="True" AllowDrop="True" IsSwipeEnabled="True" SelectionMode="None">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <StackPanel>
                                    <Border BorderBrush="Black" BorderThickness="1">
                                        <TextBlock Foreground="Blue" Text="{Binding ItemName}"/>
                                    </Border>
                                </StackPanel>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>
public sealed partial class MainPage : Page
{
    private GroupList groupList = new GroupList();

    public MainPage()
    {
        InitializeComponent();
        groupListView.DataContext = groupList.Groups;
    }
}