3

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. グループ 1 をグループ 2 とグループ 3 の間にドラッグ アンド ドロップし
ます。 3. アイテム 1 をグループ 1 からグループ 2 にドラッグします。

クラッシュが発生するはずです。

これが起こらないように、さまざまな方法を試して何時間も髪を抜いてきました. 最も近いのは、Drop イベントを処理して Handled=true を設定することでしたが、グループ ヘッダーの 1 つにドロップするとクラッシュします。誰かが私がこれを理解するのを手伝ってくれるなら、私はそれを大いに感謝します!

ありがとうございました、

トッド

4

0 に答える 0