我们有一个带有菜单树和Tabcontrol的WPF应用程序。 单击TreeView中的MenuItem,将创建一个新的UserControl并将其分配给tabItem中的。 此新用户控件具有嵌套的用户控件作为其内容。这里父用户控件具有直接数据上下文绑定(即this.DataContext = SampleViewModel),并且所有嵌套/子用户控件都具有自我数据绑定(即," DataContext = {Binding}")as它仅使用父级的DataContext。
一旦WPF应用程序获得工具用户控件,它就会将用户控件放在Tabitem中,并将Keyboard焦点设置到用户控件上。下面是为实现此工作流程而执行的代码序列。
无需等待加载用户控件,我们继续执行以下操作,例如
如上所述,使用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(...)执行设置KeyBoard焦点在TabControl内部的用户控件上的逻辑,内部/子用户控件中使用的自我数据绑定工作得非常好。但是如果我们使用Invoke()将焦点设置在User控件上,则内部/子用户控件的自我数据绑定不起作用。因此,没有任何子用户控件元素在UI上呈现。
这是内部用户控件的xaml代码,它具有自我DataContext绑定
<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}”时,please check the observations noticed screen shot
如果我们在BeginInvoke()和Invoke()调用之间做出选择,那么自我数据绑定怎么会受到影响? 在用户控件上调用与Focus()相关的API之前是否需要遵循任何序列?
请建议如何解决此问题。
提前致谢,
Pankaja。小号