簡體   English   中英

具有RecycleElement CachingStrategy的Xamarin Forms Listview無法正確更新綁定上下文

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM