当用户在ItemTemplate文本框中单击时,在ListView中设置SelectedItem

时间:2013-06-07 15:31:25

标签: wpf listview textbox selecteditem itemtemplate

我有以下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的一些技巧,但说实话,我并不完全知道我在那里做什么。

2 个答案:

答案 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;
}