滚动ListView添加项时触发'Cannot access a disposed object'错误求助
解决MAUI ListView自定义ItemTemplate滚动时的已释放对象错误
问题详情
在MAUI项目中,给ListView添加包含Frame控件的自定义ItemTemplate后,向数据源追加数据并滚动列表时,触发如下错误:
'Cannot access a disposed object. Object name: 'Microsoft.Maui.Controls.Handlers.Compatibility.FrameRenderer'.'
使用无自定义模板的简化版ListView时功能正常,自定义模板的XAML代码如下:
<ListView x:Name="PlayerList" ItemsSource="{Binding Players}" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Margin="10,0,10,0" HasUnevenRows="True" SelectionMode="None" > <ListView.ItemTemplate> <DataTemplate x:DataType="x:String"> <ViewCell> <Frame BorderColor="{StaticResource PurpleElement1}" BackgroundColor="{StaticResource PurpleElement1}" Margin="5" CornerRadius="7" > <Label Text="{Binding .}" HorizontalOptions="Center" VerticalOptions="Center" Margin="5,0,5,0" /> </Frame> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView>
数据源Players为List<String>类型。
解决方案
1. 用Border控件替代Frame
Frame属于MAUI兼容性控件,依赖旧版Xamarin渲染器,在ListView单元格复用场景下易出现生命周期异常。MAUI原生的Border控件是更稳定的替代方案,功能匹配且适配现代渲染逻辑:
<ListView x:Name="PlayerList" ItemsSource="{Binding Players}" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Margin="10,0,10,0" HasUnevenRows="True" SelectionMode="None" > <ListView.ItemTemplate> <DataTemplate x:DataType="x:String"> <ViewCell> <Border Stroke="{StaticResource PurpleElement1}" Background="{StaticResource PurpleElement1}" Margin="5" StrokeThickness="1" CornerRadius="7" > <Label Text="{Binding .}" HorizontalOptions="Center" VerticalOptions="Center" Margin="5,0,5,0" /> </Border> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView>
2. 将数据源替换为ObservableCollection
List不会主动通知UI数据变化,追加数据时可能导致ListView复用逻辑混乱。改用ObservableCollection<string>,数据更新时自动触发UI同步,避免渲染器状态异常:
public ObservableCollection<string> Players { get; set; } = new ObservableCollection<string>();
3. 临时调整单元格缓存策略(不推荐长期使用)
如果上述方法无效,可尝试修改ListView缓存策略为RetainElement,禁用单元格复用(会增加内存占用、降低性能,仅作为临时 workaround):
<ListView x:Name="PlayerList" ... CachingStrategy="RetainElement">
4. 更新MAUI到最新稳定版
该错误可能是旧版MAUI的已知bug,升级到.NET 7或.NET 8的最新补丁版本,多数兼容性渲染器问题已被修复。
内容的提问来源于stack exchange,提问作者Silny ToJa
相关产品推荐
相关产品推荐

