2011-01-13 4 views
3

DataTemplate을 사용하여 개체를 표시하는 ListBox가 있습니다. DataTemplate에는 TextBox가 있습니다. 사용자가 ListBox에서 항목을 선택하면 선택한 항목의 TextBox에 포커스를 설정하려고합니다.ListBoxItem을 선택하면 ItemTemplate 내의 컨트롤에 포커스를 어떻게 설정합니까?

ListBox.SelectionChanged를 처리하여 부분적으로이 작업을 수행 할 수 있었지만 사용자가 ListBox를 클릭하여 항목을 선택할 때만 작동합니다. - 사용자가 ListBox에 들어가서 화살표를 사용하면 작동하지 않습니다. 키를 눌러 TextBox.Focus() 인데도 항목을 선택하십시오.

사용자가 키보드를 사용하여 항목을 선택할 때 어떻게 TextBox에 포커스를 설정할 수 있습니까? 이와 SelectionChanged 이벤트 처리기에서 tb.Focus()를 대체하는 것입니다 할

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

한 가지 방법 : 여기

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

취급 코드 : 여기

은 목록 상자의 마크 업입니다

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

이것은발송자의은 발송자가 사용 가능할 때 - 즉 WPF가 내부적으로 이벤트를 처리 한 후에 지정된 코드가 실행되도록합니다.

목록 항목에 포커스가있을 때 처음으로 아래쪽 화살표를 누르면 다음 목록 항목이 선택되고 텍스트 상자에 포커스가 지정되고 아래쪽 화살표로 다시 선택 항목을 이동할 수 없습니다. 이 경우에도 처리 할 수있는 코드를 작성하는 것이 좋습니다.

+0

좋은 답변 : 왜 설명이 * 왜 * 작동하는지 설명하는 문장을 추가해도 괜찮습니까? 나는 그것이 약간 더러웠다라고 말해야한다. 그러나 그것은 직업을 끝낸다. –

+0

와우. 그 선은 날 보호기이었다! 정말 고맙습니다. – Timotei

관련 문제