WPF - 应用于FlyoutControl的DataTemplate中的焦点控制

时间:2014-07-29 22:00:11

标签: c# wpf focus devexpress datatemplate

我有一个包含TextBox的DataTemplate。 DataTemplate绑定到DevExpress FlyoutControl的Style的ContentTemplate属性。 Flyout Control本身位于另一个TextBox的ControlTemplate中。

当聚焦FlyoutControl的TextBox时,我想将焦点重定向到FlyoutControl的ContentTemplate中的第一个TextBox(来自DataTemplate)。在我想要聚焦的TextBox上设置FocusManager.FocusedElement = {Binding RelativeSource = {RelativeSource Self}},这是第一次完成此操作,但是一旦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>

正在以代码打开弹出窗口。在这里,我也想重点关注TextBox(TextThatWantsFocus)。但是,我尝试过的任何东西都不会让它成为焦点(除了FocusManager第一次处理它),包括涉及触发器的典型SO答案。任何想法都将不胜感激。

2 个答案:

答案 0 :(得分:2)

我接受了DmitryG的建议并提交了DevExpress支持票,他们能够提供解决方案。

通过处理我想要关注的TextEdit的Loaded事件并使用调度程序来关注它来解决问题:

private void TextThatWantsFocus_Loaded(object obj, RoutedEventArgs e)
{
    var text = obj as FrameworkElement;
    Dispatcher.CurrentDispatcher.BeginInvoke(new Action(delegate()
        { text.Focus(); }));
}

答案 1 :(得分:1)

我建议您使用DevExpress MVVM Framework中的FocusBehavior:

<DataTemplate x:Key="FlyoutTemplate">
   <Grid>
      <dxe:TextEdit>
        <dxmvvm:Interaction.Behaviors>
            <local:FocusBehavior/>
        </dxmvvm:Interaction.Behaviors>
      </dxe:TextEdit>
   </Grid>
</DataTemplate>