我正在使用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事件上调用它,但这是相同的。
我什么时候可以打电话给我?还是我应该采用其他方式?