提问人:Ggilabert 提问时间:2/26/2023 更新时间:2/26/2023 访问量:480
更新 ListView 中使用的 ObservableCollection 时出现净 7 毛伊岛空引用异常
Net 7 Maui Null Reference Exception when updating ObservableCollection used in ListView
问:
我正在开发一个 Net7 Maui 应用程序,在更新 ListView 以显示数据时遇到了问题。当我更新绑定到 ListView 的 ItemsSource 的 ObservableCollection 时,我收到一个 null 引用异常。这发生在 Android 上,但不发生在 Windows 上。 下面是重现该错误的代码示例:
MainPage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ListViewBugSample.MainPage">
<ScrollView>
<VerticalStackLayout
Spacing="25"
Padding="30,0"
VerticalOptions="Center">
<Button
x:Name="UpdateData"
Text="Click me"
Clicked="UpdateListViewData"
HorizontalOptions="Center" />
<ListView ItemsSource="{Binding CurrentData}">
<ListView.ItemTemplate>
<DataTemplate>
<ImageCell ImageSource="{Binding Description}"
Text="{Binding Name}"
Detail="{Binding Description}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</VerticalStackLayout>
</ScrollView>
</ContentPage>
MainPage.xaml.cs
using ListViewBugSample.ViewModels;
namespace ListViewBugSample;
public partial class MainPage : ContentPage
{
private SomeDataViewModel _listViewModelData = new();
public MainPage()
{
InitializeComponent();
BindingContext= _listViewModelData;
}
private void UpdateListViewData(object sender, EventArgs e)
{
var newData = new List<SomeData>
{
new() { Description = "NewData1", Name = "NewName1"},
new() { Description = "NewData2", Name = "NewName2" },
new() { Description = "NewData3", Name = "NewName3" }
};
_listViewModelData.CurrentData.Clear();
newData.ForEach(x => _listViewModelData.CurrentData.Add(x));
}
}
SomeDataViewModel.cs
using System.Collections.ObjectModel;
namespace ListViewBugSample.ViewModels
{
public class SomeDataViewModel
{
public ObservableCollection<SomeData> CurrentData { get; set; }
public SomeDataViewModel()
{
CurrentData = new ObservableCollection<SomeData>() {
new() { Description = "Desc1", Name = "Name1"},
new() { Description = "Desc2", Name = "Name2" },
new() { Description = "Desc3", Name = "Name3" } };
}
}
public class SomeData
{
public string Name { get; set; }
public string Description { get; set; }
}
}
当您运行应用程序时,它将在第一次加载数据,但是当您点击按钮并清除并重新加载集合时,您将获得空引用异常。 我调试了应用程序,问题不在于清除或添加数据时,似乎是绑定新数据时发生的事情。
我找到了这个问题的解决方法:如果将 ListViewCachingStrategy 更改为 RecycleElement,它将正常工作,因此问题似乎出在它第二次尝试生成单元格但不确定时。
我做错了什么,或者这是 MAUI 上的错误?
答:
0赞
Umesh Kamble
2/26/2023
#1
试试下面的 ListView
<ListView ItemsSource="{Binding CurrentData}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<VerticalStackLayout>
<!--<ImageCell
Detail="{Binding Description}"
ImageSource="{Binding Description}"
Text="{Binding Name}" />-->
<Label Text="{Binding Name}" />
<Label Text="{Binding Description}" />
</VerticalStackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
评论
0赞
Julian
2/26/2023
您可能想解释您更改了什么,以及这将如何解决 OP 的问题。
1赞
Ggilabert
2/26/2023
我尝试了将 ImageCell 替换为 ViewCell 的 Umesh Kamble 解决方案,它工作正常,因此问题似乎出在具有默认缓存策略的 ImageCell 中。
评论