我正在建立一个应用程序,其中有一个任意长的项目列表,您可以点击其中任何一个并进行编辑。当您编辑任何这些项目时,我想以编程方式将焦点更改为列表中的下一个项目。
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<phone:LongListSelector x:Name="MainLongListSelector" Margin="0,0,-12,0" ItemsSource="{Binding Items}" SelectionChanged="MainLongListSelector_SelectionChanged">
<phone:LongListSelector.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,-10,0,-12">
<TextBox x:Name ="tb" Text="{Binding TheText}" TextWrapping="Wrap" TextChanged="TextBox_TextChanged" />
</StackPanel>
</DataTemplate>
</phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>
</Grid>
当用户键入第一个TextBox并且他的文本超过某个字符数(例如138)时,我想要将另一个项目添加到列表作为下一个项目并将焦点更改为它,或者,如果有&#39 ; s已经是下一个项目,将焦点改为它。
我无法弄清楚如何访问
1)根列表框 2)给定列表框项目ID
的项目中的TextBox控件这是我尝试过的。当它运行时,MainLongListSelector.SelectedITem = nextItem
会导致选择下一个项目,但它不会得到焦点。
private void TextBox_TextChanged(object sender, TextChangedEventArgs e) {
var editBox = sender as TextBox;
var selectedItem = MainLongListSelector.SelectedItem as ItemViewModel;
if (editBox != null && selectedItem != null && editBox.Text.Length > 138) {
// Move data at end to next box
var overflow = editBox.Text.Substring(138, editBox.Text.Length - 138) ;
selectedItem.Tweet = editBox.Text.Substring(0, 138);
var nextItem = App.ViewModel.Items[int.Parse(selectedItem.ID) + 1];
nextItem.Tweet = overflow;
MainLongListSelector.SelectedItem = nextItem;
}
}
我希望能够访问nextItem
的实际TextBox,这样我就可以明确地将焦点设置为它。
如果我只使用ListBox
但问题不同,同样的问题也适用。在ListBox
DataTemplate
包含TextBox
且焦点设置的情况下,我不会收到SelectionChanged
个事件......这就是我为什么会这样做的原因。坚持LongListSelector
。
答案 0 :(得分:0)
如果我理解正确,您希望TextBox在选择项目项时获得焦点。
如果这是你需要的,这里有一种方法将LisBoxItem.IsSelected绑定到Element.Focus(): http://social.msdn.microsoft.com/Forums/en-US/adeb3e7f-16df-4c7b-b2d2-d7cdedb32ac0/setting-focus-of-a-textbox-inside-a-listbox?forum=wpf