ListView 绑定仅在滚动时更新 UI

ListView binding only updating UI when scrolling

我有一个 Xamarin Forms 项目,使用 ViewModels 和 XAML 绑定。我有一个绑定到特定对象的 ObservableCollection 的特定 ListView。

单击时我尝试更改按钮的颜色,我可以看到事件正在触发,并且 PropertyChanged 按预期工作,但是按钮不会更改颜色,直到我向下滚动 ListView使其不再可见,然后向上滚动回到它。一旦我向后滚动,我假设这会触发某种 "Let me know your state so I can display you" 事件,然后该事件会接受更改。

下面是我的XAML:

<ListView CachingStrategy="RecycleElement" ItemsSource="{Binding ListViewItems}" Margin="0,20,0,0" RowHeight="130" SeparatorVisibility="None" VerticalOptions="FillAndExpand" Grid.Column="1" Grid.Row ="0" >
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Button Command="{Binding HeatClickedCommand}" Margin="5,10,5,10" HorizontalOptions ="FillAndExpand" BackgroundColor="{Binding color_hex}" Grid.Column="1" TextColor="{StaticResource LightTextColor}" FontSize="Medium" Text="{Binding heat_title}"></Button>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

你可能注意到我正在使用 CachingStrategy="RecycleElement" 这可能有时与此问题有关,其背后的原因在之前的 SO post .

中进行了解释

基本上使用默认的 CachingStrategy 导致了意外的结果。

要立即更新视图,您必须在模型上实现 INotifyPropertyChanged 接口。使用此接口,每当 属性 值更改时,它都会通知 UI 并进行相应更新。

它在您滚动时更新的原因是因为单元格被重新绘制甚至完全重新填充。

不要误以为使用 ObservableCollection 就可以做到这一点,因为这只会反映集合结构中的更新,而不是其中的模型。