在WPF中我可以指定一个控件容器是一个焦点范围,并且该选项卡导航应循环通过控件(即当我从最终控件中跳出时,焦点将返回到第一个):
<Border FocusManager.IsFocusScope="True" KeyboardNavigation.TabNavigation="Cycle">
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox x:Name="Editor" Text="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
我想要做的是在焦点离开最终字段时检测。如果不确切知道焦点范围内的控件数量,有人知道这是否可能吗?
答案 0 :(得分:0)
此功能似乎没有内置到WPF中,正如您似乎已经发现的那样。
我的建议是建立一个附加行为来处理这个问题。
如果你有Blend并且可以使用System.Windows.Interactivity,只需从Behavior类派生并覆盖OnAttached和OnDetached。否则,编写一个静态行为类,如演示here。
附加行为后,保存第一个(当前?)焦点项并订阅焦点更改事件。在事件处理程序中,跟踪焦点范围内的焦点项(应用行为的范围)。当焦点项返回第一个项时,触发路由事件。有一些细节需要解决。
答案 1 :(得分:-1)
为了结束这个问题,我正在将我的评论改为答案。解决方案主要是在视图模型中保留所选项目的记录,并对其进行更改。作为一般规则,我不认为视图模型应该知道控制焦点,但在这种情况下,我认为这是必需的,因为视图模型需要对焦点变化作出反应。
最后,我能够使用。来解决我的具体问题 默认集合视图,以保留当前项目的记录,以及一些 附加属性以使其与当前键盘保持一致 焦点