我有以下ListView(简化):
<ListView Name="lvwNotes" KeyUp="lvwNotes_KeyUp">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<DockPanel Background="LightGray">
<TextBlock DockPanel.Dock="Right" Text="{Binding Path=Author}" />
<TextBlock Text="{Binding Path=Timestamp}" />
</DockPanel>
<TextBox Text="{Binding Path=Text}"
GotFocus = "lvwNotes_TextBox_GotFocus"
TextWrapping="Wrap" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
仅当用户使用TextBlocks单击DockPanel而不是单击TextBox时,才能通过单击更改所选项目。我想要实现的是将所选项目设置为包含用户单击的TextBox的项目。
我设法了解了与TextBox相关的ListViewItem:
private void lvwNotes_TextBox_GotFocus(object sender, RoutedEventArgs e) {
DependencyObject o = Tools.GetAncestorByType((DependencyObject)sender, typeof(ListViewItem));
if (!o.Equals(null)) {
// code to select this ListViewItem
}
}
但设置
lvwNotes.SelectedIten = o ;
仍然没有效果。我也尝试过Dispatcher.BeginInvoke的一些技巧,但说实话,我并不完全知道我在那里做什么。
答案 0 :(得分:6)
将此添加到您的代码中
<ListView.Resources>
<Style TargetType="ListViewItem">
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="IsSelected" Value="True" />
</Trigger>
</Style.Triggers>
</Style>
</ListView.Resources>
答案 1 :(得分:2)
DataContext
除非在DataTemplate
中明确更改,否则为当前项目,因此:
private void lvwNotes_TextBox_GotFocus(object sender, RoutedEventArgs e)
{
var tb = (TextBox)sender;
lvwNotes.SelectedItem = tb.DataContext;
}