我有一个包含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答案。任何想法都将不胜感激。
答案 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>