当ItemsSource改变时,将焦点集中于ItemsControl模板的第一个TextBox。
当ItemsSource改变时,将焦点集中于ItemsControl模板的第一个TextBox。
我正在使用C#/WPF和MVVM模式开发一个应用程序。
我有一个屏幕显示一些支持。每个支持都有一些空间的集合。用户必须能够在空间上输入一些信息。
我在我的视图上有一个GlobalViewModel作为数据上下文。它包含了一个SupportViewModels的ObservableCollection和一个current SupportViewModel,这些对象都绑定到一个DataGrid。下面我使用一个ItemsControl和一个dataTemplate来显示空间。ItemsControl.ItemsSource绑定到CurrentSupport.Spaces(一个SpaceViewModels的ObservableCollection)。
如果我简化我的视图,会是这样的:
x:Name="supportGrid" CanUserDeleteRows="False" CanUserInsertRows="False" ItemsSource="{Binding Supports}" SelectedItem="{Binding CurrentSupport}" AutoGenerateColumns="False" >
x:Name="spacesItems" ItemsSource="{Binding CurrentSupport.Spaces}" > HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Header="{Binding Code, Mode=OneWay}" > Grid.Column="1" Mask="" HorizontalAlignment="Stretch" SelectionOnFocus="SelectAll"> Command="{Binding FindCommand}" CommandParameter="{Binding Text, ElementName=findSearchBox}" Content="Search" />
我希望当当前支持发生变化时(由用户或代码触发),第一个TextBox(在spacesItems DataTemplate中定义)的第一个空间会被选中。
为了选中第一个空间中的“findSearchBox”,我找到了这个解决方案:https://stackoverflow.com/questions/29273566/how-to-focus-a-datatemplated-textbox-in-the-first-element-of-an-itemscontrol-in
private void SetFocusOnSearchBox()
{
if (!spacesItems.HasItems)
return;
DependencyObject cp = spacesItems.ItemContainerGenerator.ContainerFromIndex(index: 0);
RadMaskedTextInput tb = FindVisualChild
if (tb != null)
{
FocusManager.SetFocusedElement(spacesItems, tb);
}
}
如果我在按钮点击时调用该方法,它可以正常工作。但是当我在DataGrid的SelectionChanged事件中调用该方法时,它不起作用,因为spacesItems.ItemContainerGenerator.ContainerFromIndex(0)在此时还没有任何子项。我也尝试在CurrentSupport属性的属性更改事件中调用它,但结果相同。
我应该在什么时候调用它?还是有其他方法可以实现?