У меня есть 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