Wpf 将焦点设置为用户控件时,自DataContext绑定有时不起作用

Wpf 将焦点设置为用户控件时,自DataContext绑定有时不起作用,wpf,data-binding,Wpf,Data Binding,我们有一个带有菜单树和Tabcontrol的WPF应用程序。 单击TreeView中的菜单项时,将创建一个新的UserControl并将其分配给选项卡项中的。 此新用户控件将嵌套用户控件作为其内容。这里,父用户控件具有直接数据上下文绑定(即this.DataContext=SampleViewModel),所有嵌套/子用户控件都具有自数据绑定(即“DataContext={binding}”),因为它仅使用父用户的DataContext 一旦WPF应用程序获得工具用户控件,它将把用户控件放在Ta

我们有一个带有菜单树和Tabcontrol的WPF应用程序。 单击TreeView中的菜单项时,将创建一个新的UserControl并将其分配给选项卡项中的。 此新用户控件将嵌套用户控件作为其内容。这里,父用户控件具有直接数据上下文绑定(即this.DataContext=SampleViewModel),所有嵌套/子用户控件都具有自数据绑定(即“DataContext={binding}”),因为它仅使用父用户的DataContext

一旦WPF应用程序获得工具用户控件,它将把用户控件放在Tabitem中,并将键盘焦点设置到用户控件上。下面是为实现此工作流程而执行的代码序列

  • 单击菜单项时,将创建新的选项卡项,并将新的usercontrol作为内容
  • 在不等待加载用户控件的情况下,我们继续执行以下操作,如

    • 将焦点从先前选择的tabitem-->转移到当前选项卡项,这是将焦点从先前选择的用户控件转移到当前用户控件
    • 更新成功打开菜单项的菜单树-->这将突出显示单击的菜单项
    如上所述,使用Dispatcher.BeginInvoke()设置用户控件的焦点,如下所示

    Application.Current.Dispatcher.BeginInvoke(new Action(delegate
    {
        if (this.selectedTabItem != null && this.selectedTabItem.ToolUserControl != null)
        {
            (this.SelectedTabItem.ToolUserControl).Focus();
            (this.SelectedTabItem.ToolUserControl).Focusable = true;                                
            Keyboard.Focus(this.SelectedTabItem.ToolUserControl);
        }
    }), DispatcherPriority.Background, null);
    
  • 问题陈述:

    如果我们使用BeginInvoke(…)来执行将键盘焦点设置在TabControl中存在的用户控件上的逻辑,则内部/子用户控件中使用的自数据绑定绝对可以正常工作。但是,如果我们使用Invoke()来设置用户控件的焦点,那么内部/子用户控件的自数据绑定将不起作用。因此,在UI上不会呈现任何子用户控件元素

    下面是具有自DataContext绑定的内部用户控件的xaml代码

    <UserControl x:Class="SampleApp.ExtrauserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" DataContext="{Binding }"
             d:DesignHeight="300" d:DesignWidth="300">
    
    <TextBox Height="20" Name="sampleText" Margin="10"
             Text="{Binding Path=ExtraUCText, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, 
             NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}"/>
    
    </UserControl>
    
    
    
    当内部用户控件的数据上下文属性绑定为“DataContext={Binding}”时

    如果我们在BeginInvoke()和Invoke()调用之间进行选择,自数据绑定会受到什么影响?? 在调用usercontrol上与Focus()相关的API之前,是否需要遵循任何顺序

    请建议如何解决这个问题

    提前感谢,


    潘卡哈。S

    问题在于用户控件未渲染或焦点设置不正确?内部用户控件未渲染内部用户控件如果您根本没有使用Invoke或BeginInvoke设置焦点,则内部用户控件将渲染?是。即使使用BeginInvoke()内部用户控件也可以完全渲染。问题发生在Invoke()上为了回答第一个问题,问题发生在内部用户控件的数据上下文上,其中in-Data-Context变为null,因为数据绑定失败了w.r.t内部用户控件。最终结果是内部用户控件未在UI上呈现。问题是,用户控件未呈现,还是焦点设置不正确?内部用户控件未呈现。如果您根本没有使用Invoke或BeginInvoke设置焦点,则内部用户控件将呈现?是。即使使用BeginInvoke()内部用户控件也可以完全渲染。问题发生在Invoke()上为了回答第一个问题,问题发生在内部用户控件的数据上下文上,其中in-Data-Context变为null,因为数据绑定失败了w.r.t内部用户控件。最终结果是内部用户控件不会呈现在UI上。