2011-01-13 65 views
3

我有一個使用DataTemplate呈現對象的ListBox。 DataTemplate包含一個TextBox。當用戶在列表框中選擇一個項目時,我想將焦點設置到所選項目的文本框中。如何在選擇ListBoxItem時將焦點設置爲ItemTemplate中的控件?

我已經能夠通過處理ListBox.SelectionChanged來部分實現這個功能,但它僅在用戶單擊ListBox來選擇項目時才起作用 - 如果用戶在ListBox中選項卡並使用箭頭即使調用TextBox.Focus(),也可以選擇項目

如何在用戶使用鍵盤選擇項目時將焦點設置到文本框?

下面是ListBox中的標記:

<ListBox Name="lb1" SelectionChanged="ListBox_SelectionChanged" ItemsSource="{Binding Items}" > 
    <ListBox.ItemTemplate> 
     <DataTemplate > 
      <TextBox></TextBox> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

下面是處理代碼:

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    ListBoxItem lbi = (ListBoxItem)this.lb1.ItemContainerGenerator.ContainerFromItem(this.lb1.SelectedItem); 
    Visual v = GetDescendantByType<TextBox>(lbi); 
    TextBox tb = (TextBox)v; 
    tb.Focus(); 
} 

回答

6

一種方式做,這是從你的SelectionChanged事件處理程序替換tb.Focus()

tb.Dispatcher.BeginInvoke(DispatcherPriority.Input, new ThreadStart(delegate() 
     { 
      tb.Focus(); 
     })); 

這是可行的,因爲要求分派器上的會導致指定的代碼在調度程序可用時運行 - 即WPF在內部完成處理事件之後。

問題在於,當列表項具有焦點時第一次按下箭頭後,下一個列表項將變爲選中狀態,其文本框將變爲焦點並且您將無法再使用向下箭頭移動選擇項。你可能也想編寫一些代碼來處理這種情況。

+0

不錯的一個:)希望你不介意我是否在解釋* why * it的答案中加了一個句子。我不得不說這感覺有點骯髒,但它完成了工作。 – 2011-01-17 00:26:11

相關問題