列表视图选择“活动”项

时间:2011-10-03 10:21:30

标签: wpf listview

  

可能重复:
  Select ListBoxItem if TextBox in ItemTemplate gets focus

我有ListView绑定到ObservableCollectionListview.ItemsSource)。列表视图显示了几个绑定到可观察集合中对象属性的文本框。

我希望具有以下功能:当用户关注文本框时,列表视图中的相应项应该被选中。

我尝试使用ContainerFromElement,ContainerFromItem等,但无法使用“简单”功能。

任何想法......

2 个答案:

答案 0 :(得分:6)

这里的诀窍是使用IsKeyboardFocusWithin上的ItemContainerStyle属性:

<ListView ItemsSource="{Binding}">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Style.Triggers>
                <Trigger Property="IsKeyboardFocusWithin" Value="True">
                    <Setter Property="IsSelected" Value="True" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Path=YourPropertyValue}" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

在这个例子中,我们只是声明只要该项目中的控件包含键盘焦点,就应该将IsSelected设置为true。

注意:这在相反方向不起作用;选择列表中的特定项目不会自动将焦点放在包含的TextBox

编辑以回应评论

正如Joep指出的那样,这意味着失去键盘焦点(当TextBox获得焦点之外的控件时会发生这种情况)会导致IsSelected属性重置为false。您可以通过使用触发器输入操作替换Style setter来解决此问题,这可以防止在触发器不再有效时撤消更改。

要使其工作方式与上一个示例相同,您需要明确将SelectionMode的{​​{1}}设置为ListView;否则,可以立即选择多个项目。

Single

答案 1 :(得分:0)

MVVM方式将向ViewModel添加额外的属性,表示焦点属性。

例如,如果ViewModel具有属性Name,则添加属性IsNameFocussed,如果它具有属性Address,则添加属性IsAddressFocussed。

然后将DataTemplate中的相应控件绑定到Is ... Focussed属性以突出显示它。

剩下的就是在文本框的GotFocus和LostFocus事件中设置Is ... Focussed属性。 (我宁愿绑定一个Focussed Property,但它不存在......)

相关问题