首先,我找到了这个答案,最初以为它解决了我的问题: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();
}
}
}
答案 0 :(得分:0)
好的,所以我找到了问题所在,但我不知道最佳解决方案。在用新项更新TabControl之前,引发CollectionChanged事件。这意味着在短时间内将SelectedTabIndex设置为最后一项是超出范围的(直到TabControl的项被更新)。
序列如下: 1.将项目添加到收藏夹 2.引发CollectionChanged事件 3. SelectedTabIndex设置为最后一个项目(TabControl还没有最近添加的项目) 4. TabControl项目已更新
我通过在CollectionChanged事件处理程序中创建一个延迟10毫秒的任务,然后设置SelectedTabIndex来证明这一点,但这似乎草率。