【问题标题】:TabControl header not selected when SelectedIndex changed更改 SelectedIndex 时未选择 TabControl 标头
【发布时间】:2018-12-06 19:36:08
【问题描述】:

首先,我找到了这个答案,最初认为它解决了我的问题: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();
        }
    }
}

【问题讨论】:

    标签: c# wpf mvvm binding tabcontrol


    【解决方案1】:

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

    顺序是这样的: 1.添加项目到收藏 2. 引发 CollectionChanged 事件 3. SelectedTabIndex 设置为最后一项(TabControl 还没有最近添加的项) 4. TabControl项更新

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

    【讨论】:

      猜你喜欢
      • 2020-04-05
      • 2023-03-15
      • 2018-03-23
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多