Вопрос по templates, wpf, tabcontrol – Как добавить новый пользовательский элемент управления в TabControl.ContentTemplate?

4

Я немного застрял с добавлением новых экземпляров usercontrol в?TabControl.ContentTemplate

Мой Xaml здесь:


    
        

        
    
    
        
            

            
        
    

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

Я очень новичок в WPF и, возможно, я делаю очень элементарную ошибку, будьте любезны.

Ваш Ответ

2   ответа
4

Saurabh, Когда вы устанавливаете Template, обычно DataTemplate, ControlTemplate и т. Д., Визуальные элементы внутри этих шаблонов повторно используются в WPF с концепцией виртуализации пользовательского интерфейса. TabControl обычно отображает только один элемент за раз, поэтому он не создает новый визуальный элемент для каждого элемента вкладки, вместо этого он только изменяет этот DataContext и обновляет привязки "Выбранный визуальный элемент ", Загруженные / выгруженные события запускаются, но объект всегда один и тот же.

Вы можете использовать загруженные / выгруженные события и написать свой код соответственноВизуальный Элемент " это ваш пользовательский контроль, так что контроль должен быть без сохранения состояния и не зависеть от старых данных. Когда новый DataContext применяется, вы должны обновить все.

События DataContextChanged, Loaded и Unloaded могут помочь вам удалить все зависимости от старых данных.

В противном случае вы создаете новый TabItem вручную, используя UserControl в качестве дочернего элемента, и добавляете его в TabControl вместо добавления элементов данных.

Добавление TabItems вручную создаст новый элемент управления для каждого элемента, и в выбранной области появятся различные элементы в зависимости от выбора.

7

ControlTemplate определяет внешний вид элементов элемента управления вкладками, которые не являются частью отдельных элементов вкладки.ItemTemplate обрабатывает содержимое отдельных элементов вкладки. Кроме того,TabItem является заголовочным элементом управления контентом, что означает, что он имеет два свойства типа контентаContent а такжеHeader с двумя отдельными шаблонамиContentTemplate а такжеHeaderTemplate, Чтобы можно было заполнять элементы вкладок с помощью привязки, необходимоTabItem используя вышеуказанные свойства.

Пример:


    
        
    
    
        
            
                
                
            
        
        
            
        
        
            
            
            
            
        
    
    
        
    

Код позади:

public partial class Window2 : Window
{
    public TabControlVM VM { get; set; }

    public Window2()
    {
        VM = new TabControlVM();
        InitializeComponent();
    }
}

И просмотр модели классов:

public class TabControlVM
{
    public ObservableCollection Items { get; set; }

    public TabControlVM()
    {
        Items = new ObservableCollection();
        Items.Add(new TabItemVM("tabitem1"));
        Items.Add(new TabItemVM("tabitem2"));
        Items.Add(new TabItemVM("tabitem3"));
        Items.Add(new TabItemVM("tabitem4"));
    }
}

public class TabItemVM
{
    public string Header { get; set; }

    public TabItemVM(string header)
    {
        Header = header;
    }
}

Похожие вопросы