iOS 下的 ObservableCollection 和 ListView 奇怪行为

ObservableCollection and ListView strange behavior under iOS

我将名为 Messages 的 ObservableCollection 绑定到 Xamarin Forms 中的 ListView。 我按如下方式填充集合:

for (int i=0; i<5; i++) {
    Messages.Insert(0, 
                new Message() {
                   Text = "M"+i
                });
}

这在 Android 下按预期工作,我的 ListView 显示 5 条带有文本 'M0',..,'M4' 的消息。 但是,在 iOS 下我会收到 5 条消息,但每条消息都显示文本 'M4'.

当我在调试器中执行此操作时,它显示每条消息的正确文本 ('M0',..,'M4')。所以数据是正确的,但是ListView显示的是每条消息中最后一条消息的文本,而不是正确的文本。

不确定这里发生了什么。任何 ideas/workarounds?

谢谢!

编辑: 请参阅下面我自己的 answer/solution。

1.Based在你的代码上我写了一个在iOS上可以正确显示的例子供大家参考:

这里是 xaml 代码:

<StackLayout>
    <ListView x:Name="mylist">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Label Text="{Binding Text}"></Label>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

这里是后台代码:

public partial class MainPage : ContentPage
{
    ObservableCollection<Message> observableCollection { get; set; } = new ObservableCollection<Message>();
    public MainPage()
    {
        InitializeComponent();
        for (int i = 0; i < 5; i++)
        {
           
            observableCollection.Insert(0, new Message() {Text = "m" + i });
        }
        mylist.ItemsSource = observableCollection;
    }
}

2.According你的代码,你每次插入的索引位置都是0,所以结果的显示应该是m3,m2,m1,m0。

事实证明,我使用的 ListView 扩展有一个 iOS 的自定义渲染器,这导致了问题。一旦我切换到 Xamarin 开箱即用的 ListView,问题就消失了。

故事的士气,使用控件扩展时要小心。