2017-02-08 10 views
0

私は現在、職場で問題に苦しんでいますが、RecycleElement戦略を使用したListViewがありますが、これはViewCellで予期しない動作を引き起こしています。Xamarin Forms Listview with RecycleElement CachingStrategyがバインディングコンテキストを正しく更新していません

ViewCellをタップすると、まずOnBindingContextChangedイベントが呼び出されます。これは、OnTappedイベントが呼び出される前に発生します。 ViewCellを押すと、アプリは別のビューにナビゲートし、そこでユーザーは対応するデータを変更できます。ユーザーが前のページに戻るときに何が起きるべきかは、入力された新しいデータがViewCellに表示されなければならないが、これは起こらないが、OnBindingContextChangedイベントはCollectionChangedを取得できても起動されないイベントは、ListViewのItemsSourceにバインドされているObservableCollectionオブジェクトから取得します。

CachingStrategyを削除すると、ListView ViewCellsから期待される動作が得られます。ユーザーがViewCellを押したときに何も起こりませんが、元のページに戻るとOnBindingContextChangedイベントが呼び出され、データが正しく更新されます。

ListViewに何百ものアイテムがあり、すべてのアイテムをスクロールしても完全に反応する必要があるため、アプリケーションのパフォーマンスにリサイクル戦略が必要です。

あり、私は共有することができます多くのコードにはありませんが、ここで私は

XAMLのリストビューの定義

<ListView x:Name="TouchformList" 
    CachingStrategy="RecycleElement" 
    ItemsSource="{Binding DisplayItems}" 
    ItemTemplate="{StaticResource TouchformTemplateSelector}" 
    HasUnevenRows="True" 
    ItemSelected="Handle_ItemSelected" 
    SeparatorVisibility="None" /> 

DisplayItemsを共有することができるものであるが
BaseTouchformItemが

ObservableObjectクラスを拡張のObservableCollectionです

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のバグですか、それとも何か他のことが起こっていますか?

+1

あなたが期待していることはわかりませんが、私が間違っていない場合、リストビューの要素はINotifyPropertyChangedイベントを実装している場合にのみデータを更新します。リストビューに表示されている要素に新しいデータをロードする必要がある場合 – Depechie

+0

オブジェクトには、INotifyPropertyChangedインターフェイスを実装するObservableObjectの基本クラスがあります。問題を見つけて、それをこのスレッド – zezioen

答えて

0

ObservableCollection内のオブジェクトを交換するときに何らかの理由でリサイクル戦略が気に入らないという問題が見つかりました。何が起こっているか無視してリストをそのまま保持します。

VMの設定方法は、アイテム自体を更新する代わりにデータが変更されるたびに各アイテムを再作成することになりました(したがって、バインディングも無関係にしています)。アイテムを更新するように変更しました同じアイテムを再作成せず、現在は期待どおりに動作しています。

関連する問題