当ItemsSource更改时,将焦点对准itemsControl模板的第一个文本框

时间:2018-06-21 07:45:57

标签: c# wpf xaml itemscontrol

我正在使用MVVM模式在C#/ WPF中开发应用程序。 我有一个显示一些支持的屏幕。每个支架都有一些空间的集合。用户必须能够在空格上输入一些信息。

我在视图上有一个GlobalViewModel作为数据上下文。它包含SupportViewModels的ObservableCollection和当前的SupportViewModel,这些对象已绑定到DataGrid。下面,我将ItemsControl与dataTemplate一起使用以显示空格。 ItemsControl.ItemsSource绑定到CurrentSupport.Spaces(= SpaceViewModels的ObservableCollection)。

如果我简化我的观点,将会是这样

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <telerik:RadGridView Grid.Row="0"
                         x:Name="supportGrid" 
                         CanUserDeleteRows="False" 
                         CanUserInsertRows="False" 
                         ItemsSource="{Binding Supports}" 
                         SelectedItem="{Binding CurrentSupport}" 
                         AutoGenerateColumns="False" >
        <telerik:RadGridView.Columns>
            <telerik:GridViewDataColumn Header="Code" DataMemberBinding="{Binding Code}"/>
            <telerik:GridViewDataColumn Header="State" DataMemberBinding="{Binding State, Converter={StaticResource EnumValueToTextConverter}}"/>
        </telerik:RadGridView.Columns>
    </telerik:RadGridView>
    <Grid Grid.Row="1" >
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <telerik:Label Grid.Column="0" Content="Code" />
        <telerik:RadWatermarkTextBox Grid.Column="1" Text="{Binding CurrentSupport.Code, Mode=OneWay}" IsReadOnly="True" />
    </Grid>
    <ItemsControl Grid.Row="2"
                  x:Name="spacesItems" 
                  ItemsSource="{Binding CurrentSupport.Spaces}" >
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <telerik:GroupBox Grid.ColumnSpan="2" 
                                      HorizontalContentAlignment="Center" 
                                      VerticalContentAlignment="Center" 
                                      Header="{Binding Code, Mode=OneWay}"
                                      >
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="Auto" />
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition />
                                <RowDefinition />
                            </Grid.RowDefinitions>
                            <telerik:Label Grid.Column="0" Content="Ref." />
                            <telerik:RadMaskedTextInput x:Name="findSearchBox" 
                                                            Grid.Column="1"
                                                            Mask="" 
                                                            HorizontalAlignment="Stretch"
                                                            SelectionOnFocus="SelectAll">
                            </telerik:RadMaskedTextInput>
                            <telerik:RadButton Grid.Column="2"
                                                   Command="{Binding FindCommand}"
                                                   CommandParameter="{Binding Text, ElementName=findSearchBox}" 
                                                   Content="Search" />

                            <!-- *** Some other fields *** -->

                        </Grid>
                    </telerik:GroupBox>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

我希望当当前支持更改(由用户或通过代码添加代码),然后是第一个文本框(在spacesItems DataTemplate中定义)<选择第一个空格的strong>。

要在第一个空格上选择“ findSearchBox”,我找到了这个How to focus a datatemplated TextBox in the first element of an ItemsControl in a Window, when the Window is opened? (C#, WPF)

private void SetFocusOnSearchBox()
{
    if (!spacesItems.HasItems)
        return;

    DependencyObject cp = spacesItems.ItemContainerGenerator.ContainerFromIndex(index: 0);
    RadMaskedTextInput tb = FindVisualChild<RadMaskedTextInput>(cp);
    if (tb != null)
    {
        FocusManager.SetFocusedElement(spacesItems, tb);
    }
}

如果我在单击按钮时调用该方法,则效果很好,但是当我在DataGrid的SelectionChanged事件上调用该方法时,该方法不起作用,因为spacesItems.ItemContainerGenerator.ContainerFromIndex(0)目前还没有任何子代。我也尝试在CurrentSupport propertyChanged事件上调用它,但这是相同的。

我什么时候可以打电话给我?还是我应该采用其他方式?

0 个答案:

没有答案