数据模板内的焦点控制应用于飞出控件

本文关键字:应用于 控件 控制 焦点 数据 | 更新日期: 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>