WPF TabControl-无法以编程方式选择选项卡

问题描述

| 我有一个带有TabControl的用户界面,该控件最初显示一个起始页。通过双击例如DataGrid中的内容,可以向其中添加其他项。创建新选项卡时,应选择它们。如果与网格中的项目相对应的文档已经打开,则应打开该文档的现有选项卡,而不要创建一个新的选项卡。 我知道我应该能够通过设置TabControl \的SelectedItem或Selectedindex属性来以编程方式选择一个选项卡。但是,所需的选项卡从未真正激活。如果我设置一个,然后在调试器中检查TabControl的状态,则两个字段似乎都正确更新。但是,在继续执行后,我看到所选的选项卡在UI中保持不变,并且如果我暂停并再次检查TabControl的状态,我会看到SelectedItem和Selectedindex已返回其先前的值。另一方面,通过在UI中单击来选择一个选项卡就可以了。 这是TabControl的声明:
<TabControl x:Name=\"Tabs\" >
    <TabItem x:Name=\"StartPageTab\" Header=\"Start Page\" DataContext=\"{Binding Path=StartPageviewmodel}\">
        ...
    </TabItem>
</TabControl>
以及用于添加和选择标签代码
private void _SelectTab(Myviewmodel model)
{
    TabItem tab;
    if (_TryFindTab(model,out tab)) Tabs.SelectedItem = tab;
}

private bool _TryFindTab(Myviewmodel target,out TabItem tab)
{
    foreach (TabItem item in Tabs.Items)
    {
        Myviewmodel model = item.DataContext as Myviewmodel;
        if (model != null && model.Equals(target))
        {
            tab = item;
            return true;
        }
    }
    tab = null;
    return false;
}

private void _AddTab(Myviewmodel model)
{
    TabItem tab = new TabItem { DataContext = model,Content = new MyView() };
    Binding bind = new Binding { Source = model,Path = new PropertyPath(\"Name\") };
    tab.SetBinding(TabItem.HeaderProperty,bind);

    Tabs.Items.Add(tab);
    Tabs.SelectedItem = tab;
}
    

解决方法

事实证明,这与我从原始问题描述中方便地省略的某些内容有关: 有问题的DataGrid位于StartPageTab的内容中。我正在通过捕获该DataGrid的MouseDoubleClick事件来处理该双击,搜索可视树以找到被双击的DataGridRow(如果有),然后引发一个最终将由主窗口捕获的事件,该事件将做出响应通过调用_SelectTab或_AddTab,具体取决于相关文档是否已打开。 此时,调用堆栈将展开并返回到该MouseDoubleClick事件处理程序。在该处理程序中,我忘记将MouseButtonEventArgs \的Handled属性设置为true。因此WPF一直在寻找其他人来处理该单击事件-最终找到的元素将通过请求焦点来响应,这反过来意味着原始标签需要重新获得焦点。 添加ѭ2可以阻止整个混乱局面,因此新选项卡可以保持选中状态。     ,您可以尝试使用tab.focus() 我的应用程序中有标签,这是一种使所选标签可见的快速方法。     ,您是否尝试过绑定到TabItem.IsSelected并在视图模型中更新它?     ,在我拥有的较旧的C#应用​​中,使用页面控件,我能够通过告诉选项卡控件对象选择选项卡来强制页面处于活动状态。
MyTabControlWithMultiplePages.SelectTab(PageIWantShown);