在将Focus设置为User控件时,Self DataContext绑定有时不起作用

时间:2017-05-10 05:47:34

标签: wpf data-binding

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

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

  1. 单击菜单项时,将使用新的usercontrol作为内容
  2. 创建新的TabItem
  3. 无需等待加载用户控件,我们继续执行以下操作,例如

    • 将焦点从之前选择的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);
    
  4. 问题陈述:

    如果我们使用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。小号

0 个答案:

没有答案