更新 ListView 中使用的 ObservableCollection 时出现净 7 毛伊岛空引用异常

Net 7 Maui Null Reference Exception when updating ObservableCollection used in ListView

提问人:Ggilabert 提问时间:2/26/2023 更新时间:2/26/2023 访问量:480

问:

我正在开发一个 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 上的错误?

ListView NullReferenceException 毛伊岛 net-7.0

评论


答:

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 中。