MAUI 分组 ListView 删除项目会导致存在多个组项目时出错

问题描述 投票:0回答:1

我在 C# MAUI MVVC 中有一个分组列表,目的地是 Andoid

public class GroupData : ObservableCollection<DetailData>
{
    public string Name { get; private set; }
    public GroupData(string name, ObservableCollection<DetailData> d) : base(d) { Name = name; }
}

public class DetailData
{
    public int Nr { get; set; }
    public string Detail { get; set; }
}

数据是这样添加的

    public ObservableCollection<GroupData> GetData()
    {
        ObservableCollection<GroupData> data = new ObservableCollection<GroupData>();

        data.Add(new GroupData("Group1", new ObservableCollection<DetailData>
        {
            new DetailData { Nr = 1, Detail = "Test 1" },
            new DetailData { Nr = 3, Detail = "Test 2" }
        }));

        data.Add(new GroupData("Group2", new ObservableCollection<DetailData>
        {
            new DetailData { Nr = 3, Detail = "Test 3" },
            new DetailData { Nr = 4, Detail = "Test 4" }
        }));

        return data;
    }

我的主页面视图模型有可绑定集合

   public ObservableCollection<GroupData> GroupData { get; } = new ObservableCollection<GroupData>();

以及显示列表时按钮上的事件。 单击它应该删除所选项目

    [RelayCommand]
    private async Task ButtonOk(DetailData data)
    {
        foreach (var item in GroupData)
        {
            foreach (var child in item)
            {
                if (child.Nr == data.Nr)
                {
                    item.Remove(child);
                    break;
                }
            }
        }
    }

数据由此显示

<RefreshView Command="{Binding RefreshCommand}" IsRefreshing="{Binding IsBusy, Mode=TwoWay}">
    <ScrollView>
        <Grid>
            <ListView ItemsSource="{Binding GroupData}" 
                      IsGroupingEnabled="True"
                      HasUnevenRows="True">
                <ListView.GroupHeaderTemplate>
                    <DataTemplate x:DataType="daten:GroupData">
                        <ViewCell>
                            <Label Text="{Binding Name}"/>
                        </ViewCell>
                    </DataTemplate>
                </ListView.GroupHeaderTemplate>
                <ListView.ItemTemplate>
                    <DataTemplate x:DataType="daten:DetailData">
                        <ViewCell>
                            <Grid >
                                <Label Text="{Binding Detail}"/>
                                <ImageButton Source="ok.jfif"
                                    Command="{Binding Source={RelativeSource AncestorType={x:Type local:MainPageViewModel}}, 
                                    Path=ButtonOkCommand}" 
                                    CommandParameter="{Binding .}"/>
                            </Grid>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </Grid>
    </ScrollView>
</RefreshView>

现在,当仅将一个分组项目添加到具有两个子项的可观察集合“组 1”时,删除效果非常完美。

但是当添加第二个“Group 2”时,不幸的是失败并出现错误

**Java.Lang.IllegalStateException: '指定的子项已经有父项。您必须首先对孩子的父母调用removeView()。 **

我做错了什么? 谢谢!!!

c# maui observablecollection
1个回答
0
投票

是的,确实如你所说。

如果我们删除了

RefreshView
的外部视图(例如
ScrollView
ListView
),我们就可以正确删除该项目。

可以参考我这边的以下代码:

<!--<RefreshView Command="{Binding RefreshCommand}" IsRefreshing="{Binding IsRefreshing, Mode=TwoWay}"  x:Name="mRefreshView">
    <ScrollView>-->
        <Grid>
            <ListView ItemsSource="{Binding GroupData}"
                  IsGroupingEnabled="True"
                  x:Name="mListView"
                  HasUnevenRows="True">
                <ListView.GroupHeaderTemplate>
                    <DataTemplate x:DataType="local:GroupData">
                        <ViewCell>
                            <Label Text="{Binding Name}"/>
                        </ViewCell>
                    </DataTemplate>
                </ListView.GroupHeaderTemplate>
                <ListView.ItemTemplate>
                    <DataTemplate x:DataType="local:DetailData">
                        <ViewCell>
                            <Grid >
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="60" />
                                    <ColumnDefinition Width="*" />
                                </Grid.ColumnDefinitions>
                                <Label Text="{Binding Detail}"/>
                                <Button  Text="test"  Grid.Column="1"
                                Command="{Binding BindingContext.ButtonOkCommand, Source={x:Reference mListView}}"
                                CommandParameter="{Binding .}"/>
                            </Grid>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </Grid>
    <!--</ScrollView>
</RefreshView>-->

注:

对于您在本例中提到的问题,您可以在此处创建一个新问题。 感谢您对毛伊岛的支持和反馈。

© www.soinside.com 2019 - 2024. All rights reserved.