更改SelectedIndex时未选择TabControl标头

时间:2018-12-06 19:36:09

标签: c# wpf mvvm binding tabcontrol

首先,我找到了这个答案,最初以为它解决了我的问题:Binding to TabControl SelectedIndex

该帖子中的标签页眉截图显示了我在标签页中看到的内容。

尤其是,在更新属性和引发PropertyChanged通知之前添加检查if(value!= _SelectedTabIndex)似乎可行。我的意思是,它使我第一个添加的标签正确显示(还选择了标题)。

但是,这仅适用于添加到TabControl的第一个项目。当我添加第二个项目时,第一个或第二个标题都没有被选中,但是第二个项目在选项卡的主体中可见,这意味着它可以正常工作。

这是我的XAML:

<TabControl Grid.Row="1" Grid.Column="2" ItemsSource="{Binding TabViewModels}"
            SelectedIndex="{Binding SelectedTabIndex, Mode=OneWay}">
    <TabControl.ItemContainerStyle>
        <Style TargetType="TabItem">
            <Setter Property="Header" Value="{Binding TabName}" />
            <Setter Property="Content" Value="{Binding}" />
        </Style>
    </TabControl.ItemContainerStyle>
</TabControl>

这是我的CollectionChanged处理程序:

private void OnTabCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    // Set selected index to last index in collection
    SelectedTabIndex = TabViewModels.Count - 1;
}

这是我的财产:

private int _SelectedTabIndex;
public int SelectedTabIndex
{
    get { return _SelectedTabIndex; }
    set
    {
        if(value != _SelectedTabIndex)
        {
            _SelectedTabIndex = value;
            OnPropertyChanged();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

好的,所以我找到了问题所在,但我不知道最佳解决方案。在用新项更新TabControl之前,引发CollectionChanged事件。这意味着在短时间内将SelectedTabIndex设置为最后一项是超出范围的(直到TabControl的项被更新)。

序列如下: 1.将项目添加到收藏夹 2.引发CollectionChanged事件 3. SelectedTabIndex设置为最后一个项目(TabControl还没有最近添加的项目) 4. TabControl项目已更新

我通过在CollectionChanged事件处理程序中创建一个延迟10毫秒的任务,然后设置SelectedTabIndex来证明这一点,但这似乎草率。