Как установить фокус на совершенно новый TextBox, который был создан в результате привязки данных в WPF? - PullRequest
1 голос
/ 16 марта 2010

У меня есть WPC ItemsControl, который связан с ObservableCollection.

XAML:

    <ItemsControl Name="mItemsControl">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Mode=OneWay}"></TextBox>    
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

Код позади:

    private ObservableCollection<string> mCollection = new ObservableCollection<string>();

    public MainWindow()
    {
        InitializeComponent();

        this.mCollection.Add("Test1");
        this.mCollection.Add("Test2");
        this.mItemsControl.ItemsSource = this.mCollection;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.mCollection.Add("new item!");
    }

Когда я нажимаю кнопку, она добавляет новую строку в привязанную к базе данных ObservableCollection, которая вызывает появление нового TextBox. Я хочу сделать акцент на этом новом текстовом поле.

Я пробовал эту технику из связанного вопроса StackOverflow , но он всегда устанавливает фокус на текстовое поле перед недавно созданным.

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.mCollection.Add("new item!");

        // MoveFocus takes a TraversalRequest as its argument.
        TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Previous);

        // Gets the element with keyboard focus.
        UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;

        // Change keyboard focus.
        if (elementWithFocus != null)
        {
            elementWithFocus.MoveFocus(request);
        }
    }

Моя потребность кажется достаточно простой, но это похоже на то, что новое текстовое поле действительно не существует до небольшой задержки после добавления чего-либо в ObservableCollection.

Есть идеи, что будет работать?

Спасибо!

-Mike

1 Ответ

3 голосов
/ 16 марта 2010

Немного взлома, но попробуйте использовать Dispatcher и BeginInvoke:

this.Dispatcher.BeginInvoke(new Action( ()=>{
    // MoveFocus takes a TraversalRequest as its argument.
    TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Previous);

    // Gets the element with keyboard focus.
    UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;

    // Change keyboard focus.
    if (elementWithFocus != null)
    {
        elementWithFocus.MoveFocus(request);
    }


}), DispatcherPriority.ApplicationIdle);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...