2010年1月21日木曜日

第6回 定期的に更新する

Twitterクライアントらしく一定間隔ごとに更新できるようにしてみたいと思います。

まずTimelineViewModelのLoad()メソッドを書き換え。



   //取得した結果をCollectionに格納(すでに入っていたらいったん空にして入れ直す)
   if (_allItems.Count > 0) {
    _allItems.Clear();
   }
   foreach (var item in result) {
    _allItems.Add(new TimelineItemViewModel(item));
   }



Load()の一部を書き換えて、このメソッドを呼ぶたびにAllItemsが最新になるようにしました。
本来ならば、前回からの差分だけを要求して
差分を追加するようにすべきですが、今回は手抜きです。

次にWindow1.xaml.csを以下のように変更します。



namespace WTwitter {
 /// <summary>
 /// Window1.xaml の相互作用ロジック
 /// </summary>
 public partial class Window1 : Window {
  TimelineViewModel viewModel = new TimelineViewModel();
  public Window1() {
   var timer = new DispatcherTimer();
   timer.Interval = TimeSpan.FromMinutes(2);
   timer.Tick += this.UpdateTimeline;
   timer.Start();

   this.DataContext = viewModel;

   InitializeComponent();
  }

  public void UpdateTimeline(object sender, EventArgs e) {
   viewModel.Load();
  }
 }
}




まずviewModel.Load()をイベントハンドラ作ってそこに移しました。
イベントハンドラとは、何かのイベントが起きたときの処理を記述したメソッドです。
今回はTimerの時間で発生するイベントとしてUpdateTimelineを指定しています。
イベントハンドラは以上のようにobjectとEventArgsの引数を取り、
戻り値はvoidというようなパターンが決められています。

あとは簡単だと思います。

今回のソースコード
http://wtwitter.codeplex.com/SourceControl/changeset/view/38373

2 件のコメント:

  1. 「あとは簡単だと思います。」の下を書き忘れました

    Timerを作って、作動間隔を2分に設定して
    2分ごとに起きるイベントをUpdateTimelineに指定して
    タイマーをスタートさせています。

    返信削除
  2. timerをローカル変数にしていたのが明らかに間違っていました。
    次回のソースコードから修正します。
    正しくはクラス変数にしてください。

    返信削除