可能重复:
Select ListBoxItem if TextBox in ItemTemplate gets focus
我有ListView
绑定到ObservableCollection
(Listview.ItemsSource
)。列表视图显示了几个绑定到可观察集合中对象属性的文本框。
我希望具有以下功能:当用户关注文本框时,列表视图中的相应项应该被选中。
我尝试使用ContainerFromElement,ContainerFromItem等,但无法使用“简单”功能。
任何想法......
答案 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,但它不存在......)