【发布时间】:2013-02-28 02:50:59
【问题描述】:
我有多个文本框的网格。根据用户可能采取的行动,应将焦点更改为文本框之一。我当前的解决方案使用 ViewModel 中的字符串属性和 xaml 中的数据触发器来更改焦点。它工作得很好,但实现这一点似乎是一种相当迂回的方式,所以我想知道它是否可以以更清晰的方式完成?
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<DataTrigger Binding="{Binding FocusedItem}" Value="number">
<Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=number}"/>
</DataTrigger>
<DataTrigger Binding="{Binding FocusedItem}" Value="name">
<Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=name}"/>
</DataTrigger>
<DataTrigger Binding="{Binding FocusedItem}" Value="id">
<Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=id}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
如您所见,属性的值和元素的名称是相同的,所以我想用一个触发器来执行此操作,而不是每个元素都有一个触发器。
也许有人可以想出一个更清洁的方法?
提前致谢
【问题讨论】:
-
我能问你为什么要这样设置焦点吗?因为用户也可以通过
TabIndexTab,所以你只需要设置一次焦点 -
只要这个解决方案适合你,你就应该接受它
-
我个人认为 Focus 是一个特定于 UI 的概念,所以我会将所有焦点处理放在 View 后面的代码中,而不是放在我的 ViewModel 中(除非焦点在业务逻辑中具有某些特定含义)。
-
@WiiMaxx 这是我的用户组要求的功能。我个人同意你的看法:)
-
@blindmeis 如果我从不尝试改进,我将不会学到任何东西,因此永远不会变得更好,
标签: c# wpf data-binding mvvm focusmanager