2017-02-08 8 views
2

私のXamarin.Formsプロジェクトでは、メッセージングアプリケーションのようにメッセージのリストのように動作するはずのリストビューがあります。私のリストビューを下にスクロールさせるためにイベントを発生させる必要があります

私のviewmodelのコンストラクタでは、非同期メソッドを起動して、状況に応じて、サーバーまたはキャッシュからメッセージをロードします。この問題は、リストビューがリストの一番上にスクロールされるようになっています。 Viewmodelから直接スクロールすることはできません。なぜなら、ViewModelをビューに結合するからです。

だから私は、メッセージを更新したときにイベントを作り、そのイベントを起こさないでください。このイベントは、最初にメッセージが更新されたときに正常に動作しますが、最初の負荷では正常に動作しません。ブレークポイントの自由な使用から、私はそれが発生することがわかりますが、それはListViewがレンダリングを終了する前であると思われ、したがって実際にはスクロールしません。

「完成したレンダリング」イベントがありますか? ViewModelにレンダリングが行われることを知ってイベントを発生させる場所がありますか?これを行うための良い方法はありますか?

+0

方法 –

+0

はまた、リストビューはあなたItemAppearingイベントがありますあなたが新しいメッセージを扱う必要がある場合に備えて、あなたの見解を利用することができます。 –

+0

C. Yu Yeah私はItemAppearingイベントにフックしようとしましたが、新しいアイテムがスクロールされて表示されたときはいつでも起動するようです。 – Fireprufe15

答えて

3

非同期の処理に時間がかかりにくいので、高速化するという問題があります。たとえば、データがObvservableCollection内にロードされたときに、イベントにサブスクライブすることができます。

ビューの背後のコードでイベントにバインドできます。基本的には、最後のアイテムまでスクロールします。このようにして、これを行うための時間を確保していることを確実にし、自分のイベントを起こすことを嫌うことはありません。

https://msdn.microsoft.com/en-us/library/ms668604(v=vs.110).aspx

あなたがて、CollectionChangedを持っている必要があります。これはあなたに理にかなっていますか?

だからあなたのビューのコードの後ろのコードのようなものになります。)(OnAppearingあなたがオーバーライドの終わりにそれを上書くことができます

_viewModel.Collection.CollectionChanged += delegate() 
{ 
    _listView.ScrollTo(_viewModel.Collection.Last(), ScrollToPosition.Start, false); 
}; 
+0

それはトリックを行うように思われ、私がやろうとしていたよりもはるかに簡単です。ありがとう:D – Fireprufe15

+0

@ Fireprufe15問題ありません!ハッピーコーディング – Mittchel