Связывание TabSontrol ItemsSource и заголовков вместе - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть TabControl, который в настоящее время отображает, как я хочу, используя следующее:

<TabControl Grid.Row="1" Background="{x:Null}" ItemsSource="{Binding TabPanels}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Content.DataContext.BreadcrumbEnd}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding Content}" />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

Показывает правильный заголовок на каждой вкладке и содержимое внутри. Источник элементов привязан к ObservableCollection, где ContentAreaHolder имеет следующий вид:

public ContentAreaHolder(UserControl content)
{
    this.Content = content;
}

private UserControl _Content;
public UserControl Content
{
    get
    {
        return _Content;
    }
    set
    {
        _Content = value;
        OnPropertyChanged("Content");
    }
}

Это выглядит очень грязно и совершенно не нужно. Однако я начал с ObservableCollection и не смог получить тот же эффект. Я использовал слегка измененный xaml:

<TabControl Grid.Row="1" Background="{x:Null}" ItemsSource="{Binding TabPanels}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding DataContext.BreadcrumbEnd}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding .}" />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

и содержимое отображается правильно, но заголовок остается пустым.

Я попытался установить заголовок через DisplayMemberPath, без привязки, но просто установил его на DataContext.BreadcrumbEnd безрезультатно.

Почему мой заголовок не отображается правильно?

1 Ответ

0 голосов
/ 07 сентября 2018

Не следует добавлять элементы пользовательского интерфейса в исходную коллекцию модели представления. TabPanels должно быть ObservableCollection<YourType> вместо ObservableCollection<UserControl>. YourType - это класс, в котором определено свойство BreadcrumbEnd. Вы могли бы тогда к этому:

<TabControl ItemsSource="{Binding TabPanels}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding BreadcrumbEnd}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <local:UserControl />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>
...