TabControl не находит шаблоны данных для элементов TabControl - PullRequest
0 голосов
/ 15 мая 2018

Я связываю коллекцию TabViewModel предметов с TabControl.Каждый из них имеет свойство заголовка string и свойство содержимого моего собственного пользовательского типа BaseTabContentViewModel, абстрактный класс, который реализует каждая фактическая модель представления данных вкладки.Например, ValuationTabViewModel, который является подклассом BaseTabContentViewModel.

. Я добавляю новый TabViewModel к Observable<TabViewModel>, чтобы TabControl подобрал его, и это отображается в пользовательском интерфейсе.Я переопределил шаблоны стилей для макета вкладки и заголовка, которые работают нормально.Единственная проблема в том, что контент не находит шаблон в моем словаре ресурсов на основе его типа, он просто отображает полное имя класса модели представления, показывая, что не находит шаблон по умолчанию для этого класса.

Почему не отображается ValuationTabViewModel, для которого ниже указана табличка с данными для этого типа?

Моя модель основного вида.

public ObservableCollection<TabViewModel> DetailTabs { get; }

var valuationTab = new TabViewModel(DetailTabConstants.ValuationTab, new ValuationTabViewModel(_eventAggregator, _errorNotifier, _windsorContainer));

DetailTabs = new ObservableCollection<TabViewModel> { valuationTab };

Основной XAML

                            <TabControl Margin="0,-2,0,0" x:Name="SelectionTabs" Style="{StaticResource DetailTabControl}" ItemsSource="{Binding DetailTabs}" 
                                        SelectedValue="{Binding SelectedTab, Mode=TwoWay}" ItemContainerStyle="{StaticResource DetailTabItem}">
                                <TabControl.ItemTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding Header}" />
                                    </DataTemplate>
                                </TabControl.ItemTemplate>
                                <TabControl.ContentTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding Content}" />
                                    </DataTemplate>
                                </TabControl.ContentTemplate>
                            </TabControl>

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

<DataTemplate x:Key="ValuationTabTemplate" DataType="{x:Type detailTabs1:ValuationTabViewModel}" >
        <detailTabs:ValuationTab Margin="0,10,0,10" />
    </DataTemplate>

ИМоя закладка Элемент ViewModel класс

public class TabViewModel : ViewModelBase
{
    private string _header;
    private BaseTabContentViewModel _content;

public string Header
{
    get => _header;
    set
    {
        _header = value; 
        RaisePropertyChanged(nameof(Header));
    }
}

public BaseTabContentViewModel Content
{
    get => _content;
    set
    {
        _content = value;
        RaisePropertyChanged(nameof(Content));
    }
}

public TabViewModel(string header, BaseTabContentViewModel viewModel)
{
    Header = header;
    Content = viewModel;            
}
}

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

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

Согласно Microsoft docs :

... если вы присвоите этому DataTemplate значение x: Key, вы переопределите неявный x: Key, и DataTemplate не будет применен автоматически

Я бы предложил удалить свойство Key и просто использовать DataType:

<DataTemplate DataType="{x:Type detailTabs1:ValuationTabViewModel}">
    ...
</DataTemplate>

Кроме того, как подразумевается @ mm8, вы явно устанавливаете ContentTemplate вашего TabControl,Вы должны удалить это из XAML.

0 голосов
/ 15 мая 2018

Удалите элемент <TabControl.ContentTemplate> и определите неявное DataTemplate (без x:Key) для каждого типа:

<TabControl Margin="0,-2,0,0" x:Name="SelectionTabs" Style="{StaticResource DetailTabControl}" ItemsSource="{Binding DetailTabs}" 
            SelectedValue="{Binding SelectedTab, Mode=TwoWay}" ItemContainerStyle="{StaticResource DetailTabItem}">
    <TabControl.Resources>
        <DataTemplate DataType="{x:Type detailTabs1:ValuationTabViewModel}">
            <detailTabs:ValuationTab Margin="0,10,0,10" />
        </DataTemplate>
    </TabControl.Resources>
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Header}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...