点击CollectionView内单个Image后多个列表元素可见性被修改问题求助
问题诱因
这个问题的核心诱因是CollectionView默认启用的UI虚拟化(视图复用)机制,具体逻辑如下:
- 为了优化长列表性能、降低内存占用,CollectionView不会为所有数据条目创建独立的视图实例,只会生成刚好能铺满当前屏幕+少量上下缓冲的单元格视图,你遇到的间隔9行出现同步变化,刚好就是你的设备一屏可显示的单元格数量。
- 当用户滚动列表时,滑出屏幕的单元格会被系统回收,重新绑定新的数据条目后复用到新进入屏幕的位置。你在点击事件里直接修改了单元格内Image视图的
Opacity属性,但没有把这个可见性状态和对应的数据条目属性做绑定,修改的仅为视图本身的状态。 - 被你设置了
Opacity=0的单元格被回收后复用到后续行时,之前修改的视图状态没有被重置,就会出现未点击的行Image也被隐藏的现象。 - 点击事件仅触发一次完全符合该逻辑:你确实只执行了一次点击操作,后续的Image隐藏是单元格复用遗留的旧视图状态,并非触发了新的点击事件。
补充修复方案
如果要避免这个问题,需要把视图的状态和数据源绑定:
- 在你的数据源条目Model类中新增对应状态属性(比如
IsImageVisible布尔属性),并实现INotifyPropertyChanged接口 - XAML中给Image的Opacity做绑定:
Opacity="{Binding IsImageVisible, Converter={StaticResource BoolToOpacityConverter}}" - 点击事件中不要直接修改Image的属性,改为获取当前单元格绑定的数据源条目,修改其对应状态属性即可
内容的提问来源于stack exchange,提问作者Erdogan
相关产品推荐
相关产品推荐

