ListView绑定仅在滚动

时间:2018-04-24 09:15:41

标签: xaml listview xamarin.forms observablecollection inotifypropertychanged

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

点击我试图更改按钮的颜色,我可以看到事件正在触发,PropertyChanged正在按预期工作,但是按钮在我向下滚动ListView之前不会改变颜色所以它不再在视野中,然后向上滚动到它。一旦我向后滚动,我认为这会触发某种"让我知道你的状态,这样我就可以向你展示"事件正在接受改变。

以下是我的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帖here中有所解释。

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

1 个答案:

答案 0 :(得分:4)

要立即更新视图,您必须在模型上实现INotifyPropertyChanged界面。使用此接口,只要属性值发生更改,它就会通知UI并相应地进行更新。

滚动时更新它的原因是因为细胞被重新绘制或者甚至完全重新填充。

不要错误地认为使用ObservableCollection会这样做,因为这只会反映集合结构中的更新,而不是其中的模型。