检测WPF焦点到达焦点范围的末尾

时间:2010-07-08 16:44:00

标签: c# wpf

在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>

我想要做的是在焦点离开最终字段时检测。如果不确切知道焦点范围内的控件数量,有人知道这是否可能吗?

2 个答案:

答案 0 :(得分:0)

此功能似乎没有内置到WPF中,正如您似乎已经发现的那样。

我的建议是建立一个附加行为来处理这个问题。

如果你有Blend并且可以使用System.Windows.Interactivity,只需从Behavior类派生并覆盖OnAttached和OnDetached。否则,编写一个静态行为类,如演示here

附加行为后,保存第一个(当前?)焦点项并订阅焦点更改事件。在事件处理程序中,跟踪焦点范围内的焦点项(应用行为的范围)。当焦点项返回第一个项时,触发路由事件。有一些细节需要解决。

答案 1 :(得分:-1)

为了结束这个问题,我正在将我的评论改为答案。解决方案主要是在视图模型中保留所选项目的记录,并对其进行更改。作为一般规则,我不认为视图模型应该知道控制焦点,但在这种情况下,我认为这是必需的,因为视图模型需要对焦点变化作出反应。

  

最后,我能够使用。来解决我的具体问题   默认集合视图,以保留当前项目的记录,以及一些   附加属性以使其与当前键盘保持一致   焦点