当ItemsSource改变时,将焦点集中于ItemsControl模板的第一个TextBox。

10 浏览
0 Comments

当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(cp);

if (tb != null)

{

FocusManager.SetFocusedElement(spacesItems, tb);

}

}

如果我在按钮点击时调用该方法,它可以正常工作。但是当我在DataGrid的SelectionChanged事件中调用该方法时,它不起作用,因为spacesItems.ItemContainerGenerator.ContainerFromIndex(0)在此时还没有任何子项。我也尝试在CurrentSupport属性的属性更改事件中调用它,但结果相同。

我应该在什么时候调用它?还是有其他方法可以实现?

0