如何在 ListView 项目的文本框中设置焦点?

How to set the focus in a TextBox of a ListView item?

在 UWP 应用程序 (Windows 10) 上,我在 ListView 中显示记录列表。

当我单击某个项目时,会显示其 StackPanel(使用 INotifyPropertyChanged)。 在 StackPanel 中,有一个文本框,其中包含一些通过绑定填充的数据。

我希望每当 StackPanel 可见时 TextBox 自动接收焦点,但我找不到要使用的 属性 或事件,以及如何触发 textBox.Focus() .

感谢您对此的反馈!

数据模板:

    <DataTemplate x:Key="templateList">
        <StackPanel>
...
            <StackPanel Visibility="{Binding IsSelected}">
                <TextBox x:Name="textBox"
                         Text="{Binding Title, Mode=TwoWay}"/>
...
            </StackPanel>
        </StackPanel>
    </DataTemplate>
...

列表视图:

<ListView x:Name="listView" 
          ItemsSource="{Binding mylist}" 
          ItemTemplate="{StaticResource templateList}"/>

对于这种情况,我建议使用 Behaviors。正如我所注意到的,您使用 Visibility 类型来表示 IsSelected 属性。这意味着我们可以使用 DataTriggerBehavior 并创建实现 IAction

SetupFocusAction
public class SetupFocusAction : DependencyObject, IAction
{
    public Control TargetObject
    {
        get { return (Control)GetValue(TargetObjectProperty); }
        set { SetValue(TargetObjectProperty, value); }
    }

    public static readonly DependencyProperty TargetObjectProperty =
        DependencyProperty.Register("TargetObject", typeof(Control), typeof(SetupFocusAction), new PropertyMetadata(0));

    public object Execute(object sender, object parameter)
    {
        return TargetObject?.Focus(FocusState.Programmatic);
    }
}

之后我们可以在XAML中使用这个动作:

xmlns:i="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"

...

<StackPanel Visibility="{Binding IsSelected}"
            Grid.Row="1">
    <TextBox x:Name="textBox"
                Text="{Binding Title, Mode=TwoWay}">
        <i:Interaction.Behaviors>
            <core:DataTriggerBehavior Binding="{Binding IsSelected}"
                                        ComparisonCondition="Equal"
                                        Value="Visible">
                <local:SetupFocusAction TargetObject="{Binding ElementName=textBox}"/>
            </core:DataTriggerBehavior>
        </i:Interaction.Behaviors>
    </TextBox>
</StackPanel>