我有一个使用绑定到 ObservableCollections 的嵌套列表视图的应用程序。父列表视图用于对项目进行分组,每个组包含项目的 ListView。我使用 ListViews 和 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;
}
}
这是页面的 XAML:
<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;
}
}
要重现此问题:
1. 运行应用程序
2. 在 Group 2 和 Group 3 之间拖放 Group 1
3. 将 Item 1 从 Group 1 拖到 Group 2
你应该看到一个崩溃。
我已经拉了几个小时的头发,尝试不同的方法来防止这种情况发生。我最接近的方法是处理 Drop 事件并设置 Handled=true,但如果你将它放到组标题之一上,它仍然会崩溃。如果有人能帮我解决这个问题,我将不胜感激!
谢谢,
托德