TabControl не удается создать первую вкладку при использовании привязки данных

#wpf #datatemplate #tabcontrol

#wpf #datatemplate #tabcontrol

Вопрос:

У меня есть элемент управления вкладкой, источник элементов которого я привязываю к наблюдаемой коллекции. Я использую шаблоны данных для определения визуального представления заголовков и содержимого вкладки.

Когда я добавляю элемент в наблюдаемую коллекцию, я получаю заголовок вкладки, но без содержимого. Когда я добавляю второй элемент в коллекцию observable, я получаю заголовки вкладок и содержимое для обоих элементов. Итак, сначала, когда второй элемент добавляется в коллекцию observable, создается содержимое для первой вкладки. Кто-нибудь знает, ошибка ли это, или может объяснить, почему это происходит? Есть ли обходной путь? Я попытался использовать селектор шаблонов с тем же результатом. Ниже приведен пример кода для воспроизведения.

Я тестировал это как с .NET 3.5, так и с 4.0.

XAML:

 <Window x:Class="TabDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300">

    <StackPanel>
        <Button Content="Add new tabitem" Click="OnAdd" />

        <TabControl 
            ItemsSource="{Binding Path=Items}">
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}" />
                </DataTemplate>
            </TabControl.ItemTemplate>
            <TabControl.ContentTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}" />
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </StackPanel>

</Window>
  

Код, лежащий в основе:

 public partial class Window1
{
    public Window1()
    {
        InitializeComponent();

        Items = new ObservableCollection<int>(); 
        DataContext = this;
    }

    public ObservableCollection<int> Items { get; set; }

    private void OnAdd(object sender, RoutedEventArgs e)
    {
        Items.Add(_random.Next(100));
    }

    private readonly Random _random = new Random();
}
  

Ответ №1:

Если вы установите SelectedIndex="0" в своем TabControl, это позволит обойти эту проблему. Я полагаю, что это связано с ошибкой, приводящей к принудительному использованию SelectedIndex при добавлении / удалении элементов.