我在 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()。 **
我做错了什么? 谢谢!!!
是的,确实如你所说。
如果我们删除了
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>-->
注:
对于您在本例中提到的问题,您可以在此处创建一个新问题。 感谢您对毛伊岛的支持和反馈。