Как установить фокус на элемент управления в ItemTemplate при выборе ListBoxItem? - PullRequest
3 голосов
/ 13 января 2011

У меня есть ListBox, который представляет объекты с использованием DataTemplate. DataTemplate содержит TextBox. Когда пользователь выбирает элемент в ListBox, я хотел бы установить фокус на TextBox для выбранного элемента.

Мне удалось частично добиться этого, обработав ListBox.SelectionChanged, но он работает только тогда, когда пользователь нажимает на ListBox, чтобы выбрать элемент - он не работает, если пользователь вкладывает в ListBox и использует клавиши со стрелками для выбора элемента , хотя TextBox.Focus () вызывается .

Как установить фокус на TextBox, когда пользователь использует клавиатуру для выбора элемента?

Вот разметка для 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();
}

1 Ответ

6 голосов
/ 14 января 2011

Один из способов сделать это - заменить tb.Focus() из вашего обработчика событий SelectionChanged на:

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

Это работает, потому что вызов BeginInvoke для диспетчера приводит к запуску указанного кода, когда диспетчер доступен, т. Е. После того, как WPF завершил внутреннюю обработку событий.

Подвох в том, что после того, как вы в первый раз нажмете стрелку вниз, когда элемент списка имеет фокус, будет выбран следующий элемент списка, его текстовое поле станет сфокусированным, и вы не сможете снова перемещать выделение с помощью стрелки вниз. Возможно, вы захотите написать некоторый код, чтобы справиться и с этим делом.

...