#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 при добавлении / удалении элементов.