私は現在、職場で問題に苦しんでいますが、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が
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のバグですか、それとも何か他のことが起こっていますか?
あなたが期待していることはわかりませんが、私が間違っていない場合、リストビューの要素はINotifyPropertyChangedイベントを実装している場合にのみデータを更新します。リストビューに表示されている要素に新しいデータをロードする必要がある場合 – Depechie
オブジェクトには、INotifyPropertyChangedインターフェイスを実装するObservableObjectの基本クラスがあります。問題を見つけて、それをこのスレッド – zezioen