![](/img/trans.png)
[英]What's the proper way to set CachingStrategy to RecycleElement in Xamarin Forms?
[英]Xamarin Forms Listview with RecycleElement CachingStrategy not properly updating binding context
我目前正在努力解決一個問題,我們有一個帶有RecycleElement策略的ListView,但這會導致ViewCells中出現意外行為。
當我點擊ViewCell時,首先發生的是調用OnBindingContextChanged事件,該事件發生在調用OnTapped事件之前。 按下ViewCell后,該應用程序導航到另一個視圖,用戶可以在其中更改其相應數據。 當用戶導航回到上一頁時,應該發生的是應該在ViewCell中顯示輸入的新數據,但是這種情況不會發生,即使通過我能夠獲取CollectionChanged,也不會觸發OnBindingContextChanged事件ObservableCollection對象的事件,該事件綁定到ListView的ItemsSource。
當我刪除CachingStrategy時,我從ListView ViewCells中獲得了預期的行為,當用戶按下ViewCell時,什么也沒發生,但是當用戶返回原始頁面時,將調用OnBindingContextChanged事件,並且正確地更新了數據。
我們需要“回收策略”來提高應用程序的性能,因為ListView中可能有數百個項目,即使滾動瀏覽所有這些項目,應用程序也需要保持完全響應。
我可以共享的代碼很少,但這是我可以共享的
XAML ListView定義
<ListView x:Name="TouchformList"
CachingStrategy="RecycleElement"
ItemsSource="{Binding DisplayItems}"
ItemTemplate="{StaticResource TouchformTemplateSelector}"
HasUnevenRows="True"
ItemSelected="Handle_ItemSelected"
SeparatorVisibility="None" />
DisplayItems是一個ObservableCollection
BaseTouchformItem擴展了ObservableObject類
在ViewModel內部,DisplayItems像這樣暴露
private ObservableCollection<BaseTouchformItem> _displayItems = new ObservableCollection<BaseTouchformItem>(); //This object is never re-assigned elsewhere
public ObservableCollection<BaseTouchformItem> DisplayItems
{
get
{
return _displayItems;
}
}
將項目添加到DisplayItems沒問題,並且這些項目按預期顯示。
只需調用DisplayItems [lastSelectedItem] = touchformItem即可更改項目; 確實會按預期在ObservableCollection中引發CollectionChanged事件,但是當RecycleElement策略處於活動狀態時,該事件不會傳播到ViewCell。
我能夠使它起作用的唯一方法是通過這種錯誤的方法,
DisplayItems.RemoveAt(lastSelectedItem);
await Task.Delay(50);//Horrible 'fix'
DisplayItems.Insert(lastSelectedItem, touchformItem);
但這顯然會導致UI“故障”,方法是快速刪除項目然后重新添加。
這可能是ListView中的錯誤,還是有其他問題?
我發現了這個問題,出於某種原因,當我換掉ObservableCollection內部的對象時,回收策略不喜歡它,它只是忽略正在發生的事情並將列表保持原樣。
VM的設置方式是每次更改某些數據時都會重新創建每個項目,而不僅僅是更新項目本身(因此也使綁定不相關),因此我對其進行了更改,以便它可以更新項目本身,而不會t再次重新創建相同的項目,現在它可以正常工作了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.