我有一个绑定到ObservableCollection
(Listview.ItemsSource
)的ListView
。该列表视图呈现了几个文本框,这些文本框绑定到可观察集合中对象的属性。
我想要以下功能:当用户聚焦文本框时,应选择列表视图中相应的项目。
我已经尝试了ContainerFromElement、ContainerFromItem等方法,但无法使这个“简单”的功能正常工作。
有什么想法...
我有一个绑定到ObservableCollection
(Listview.ItemsSource
)的ListView
。该列表视图呈现了几个文本框,这些文本框绑定到可观察集合中对象的属性。
我想要以下功能:当用户聚焦文本框时,应选择列表视图中相应的项目。
我已经尝试了ContainerFromElement、ContainerFromItem等方法,但无法使这个“简单”的功能正常工作。
有什么想法...
ItemContainerStyle
上的IsKeyboardFocusWithin
属性:<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
上。TextBox
以外的控件获得焦点时)将导致IsSelected
属性被重置为false。您可以通过用触发器进入操作替换Style
setter来解决这个问题,这样当触发器不再有效时,更改就不会被撤消。ListView
的SelectionMode
设置为Single
;否则,可能会同时选择多个项目。<ListView ItemsSource="{Binding}" SelectionMode="Single">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Trigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames
Storyboard.TargetProperty="IsSelected">
<DiscreteBooleanKeyFrame KeyTime="0:0:0"
Value="True" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</Trigger.EnterActions>
</Trigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
<!-- ... -->
</ListView>
MVVM的方式会为ViewModel添加额外的属性,这些属性表示正在聚焦的属性。
例如,如果ViewModel有一个名为Name的属性,则添加一个IsNameFocussed属性,如果它有一个名为Address的属性,则添加一个IsAddressFocussed属性。
然后将DataTemplate中适当的控件绑定到Is...Focussed属性,以突出显示它。
最后,在文本框的GotFocus和LostFocus事件中设置Is...Focussed属性即可。(我更愿意绑定到一个Focussed属性,但它不存在...)