如何在 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>
在 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>