ListViewの行を選択してフォーカスを設定する

WPFのListViewに関するサンプルです。
ListView.SelectedIndexを設定するだけでは、キーボードフォーカスがそれに得られるわけではないので、コード側で行選択した後、カーソルの上下キー入力で操作を続行できないことに気づきました。

でも単純に、


listView1.SelectedIndex = 3;
listView1.Focus();

とすれば一見上手くいったように見えますが、カーソルキーを押してみるとSelectedIndexに関係なく、最初の行に強制的に移動してしまいます。
ListView(ハコ)じゃなくてListBoxItem(各行)にフォーカスを当てないといけないようです。

このあたりの問題をぐぐってみると、MSDN Forumsにこんなのがありました。(このケースはDataTemplateとかその中のTextBoxとかが絡んできてますが)
http://forums.msdn.microsoft.com/en-US/wpf/thread/98d8423c-9719-4291-94e2-c5bf3d80cd46/

サンプルコード


//何かの処理
private void hoge(DataSet hogehoge)
{
listView1.DataContext = hogehoge;
//4行目を選択
listView1.SelectedIndex = 3;
//選択行にフォーカスを当てるためのメソッドを登録
listView1.Loaded += new RoutedEventHandler(listView1_Loaded);
}

/// ListViewの選択行にフォーカスを当てる
void listView1_Loaded(object sender, RoutedEventArgs e)
{
if (listView1.SelectedIndex >= 0)
{
ListBoxItem item = (ListBoxItem)(listView1.ItemContainerGenerator.ContainerFromItem(listView1.SelectedItem));
item.Focus();
}
//イベントハンドラを削除
listView1.Loaded -= new RoutedEventHandler(listView1_Loaded);
}

なぜLoadedイベントを使わなければならないのかはっきり理解はしていませんが、そうしないと上手くいかないのは確かなようです。(DataContext設定->SelectedIndex設定 のあとに、選択中のListBoxItemがうまくとれない)
まあDataContextとSelectedIndexの設定直後は、何かの準備/処理が足りないんでしょう。。。