数据模板内的焦点控制应用于飞出控件
本文关键字:应用于 控件 控制 焦点 数据 | 更新日期: 2023-09-27 18:15:24
我有一个DataTemplate包含一个文本框。DataTemplate被绑定到DevExpress FlyoutControl样式的ContentTemplate属性上。弹出控件本身在另一个文本框的ControlTemplate中。
当带有FlyoutControl的文本框聚焦时,我想将焦点重定向到FlyoutControl的ContentTemplate中的第一个文本框(来自DataTemplate)。FocusManager设置。FocusedElement={Binding RelativeSource={RelativeSource Self}} on TextBox我想要的焦点完成这个第一次,但一旦Flyout已经加载它不再工作。
我已经尝试了我能找到的每一个建议,但到目前为止都没有奏效。我可以得到我想在代码中引用的TextBox并调用Focus(),但它总是返回false。在最好的情况下,当我尝试在代码中聚焦它时,Flyout会聚焦,而不是Flyout中的TextBox。下面是每个相关部分的样子(省略了不相关的代码):
<DataTemplate x:Key="FlyoutTemplate">
<Grid>
<dxe:TextEdit x:Name="TextThatWantsFocus"
FocusManager.FocusedElement={Binding RelativeSource={RelativeSource Self}}" />
</Grid>
</DataTemplate>
…
<Style x:Key="FlyoutStyle" TargetType="dxe:FlyoutControl">
<Setter Property="ContentTemplate" Value="{StaticResource FlyoutTemplate}"/>
</Style>
…
<dxe:TextEdit>
<dxe:TextEdit.Template>
<ControlTemplate>
<StackPanel>
<dxe:TextEdit x:Name="InnerTextEdit" />
<dxe:FlyoutControl Style="{StaticResource FlyoutStyle}"/>
</StackPanel>
</ControlTemplate>
</dxe:TextEdit.Template>
</dxe:TextEdit>
弹出框正在代码中打开。在这里,我也想聚焦文本框(TextThatWantsFocus)。然而,我所尝试的一切都不会给它焦点(除了FocusManager第一次处理它),包括涉及触发器的典型SO答案。
我接受了DmitryG的建议,提交了DevExpress的支持单,他们能够提供解决方案。
问题通过处理我想要聚焦的texttedit的Loaded事件并使用调度程序来聚焦它来解决:
private void TextThatWantsFocus_Loaded(object obj, RoutedEventArgs e)
{
var text = obj as FrameworkElement;
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(delegate()
{ text.Focus(); }));
}
我建议您使用DevExpress MVVM框架中的FocusBehavior:
<DataTemplate x:Key="FlyoutTemplate">
<Grid>
<dxe:TextEdit>
<dxmvvm:Interaction.Behaviors>
<local:FocusBehavior/>
</dxmvvm:Interaction.Behaviors>
</dxe:TextEdit>
</Grid>
</DataTemplate>