TemplateSelector для UWP NavigationView - PullRequest
0 голосов
/ 21 марта 2019

как правильно использовать MenuItemTemplateSelector для UWP NavigationView?Я посмотрел некоторые образцы из Интернета и попробовал их (код ниже).Но это не сработало, так как должно было просто напечатать имя класса.В настоящее время я работаю в Windows версии 1809. Я уже пытался использовать тот же шаблон в listView, и он работает, поэтому мне было интересно, может ли быть ошибка в NavigationView, или я что-то упустил?Заранее спасибо:)

Вот так выглядит мой код:

Создать селектор шаблона:

public class NavigationItemTemplateSelector : DataTemplateSelector
{
    public DataTemplate DriveTemplate { get; set; }
    public DataTemplate PathTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        return SelectTemplateCore(item);
    }

    protected override DataTemplate SelectTemplateCore(object item)
    {
        if (item is Drive) return DriveTemplate;
        if (item is FileSystemElement) return PathTemplate;

        return base.SelectTemplateCore(item);
    }
}

Добавьте что-то подобное в ресурсы вашей страницы:

 <Page.Resources>
    <DataTemplate x:Key="FileSystemDataTemplate" x:DataType="entities:FileSystemElement">
        <StackPanel>
            <TextBlock Text="{x:Bind Name}" />
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="DriveDataTemplate" x:DataType="entities:Drive">
        <StackPanel>
            <SymbolIcon Symbol="{x:Bind Icon}" />
            <TextBlock Text="{x:Bind Name}" />
        </StackPanel>
    </DataTemplate>
    <entities:NavigationItemTemplateSelector x:Key="NVMenuItemsSelector" 
                                             DriveTemplate="{StaticResource DriveDataTemplate}" 
                                             PathTemplate="{StaticResource FileSystemDataTemplate}">
    </entities:NavigationItemTemplateSelector>
</Page.Resources>


Скажите NavigationView, что он должен использовать этот TemplateSelector

<NavigationView MenuItemsSource="{x:Bind ViewModel.NavigationItems, Mode=OneWay}" 
                MenuItemTemplateSelector="{StaticResource NVMenuItemsSelector}">

enter image description here

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

После просмотра вышеуказанных ссылок я решил поместить NavigationViewItem в мои шаблоны

<DataTemplate x:Key="DriveDataTemplate" x:DataType="entities:Drive">
        <NavigationViewItem Icon="{x:Bind SymbolIcon}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{x:Bind Name}" />
            </StackPanel>
        </NavigationViewItem>
</DataTemplate>

И это работает.Похоже, вы должны поставить NavigationViewItem в качестве первого ребенка.

0 голосов
/ 21 марта 2019

Проверьте эту ссылку.

Невозможно связать свойство Icon в NavigationView MenuItemTemplate

Я считаю, что оборачивание ваших StackPanels в ContentPresenter решит вашу проблему.

<DataTemplate x:Key="FileSystemDataTemplate" x:DataType="entities:FileSystemElement">
    <ContentPresenter>
        <StackPanel>
            <TextBlock Text="{x:Bind Name}" />
        </StackPanel>
    </ContentPresenter>
</DataTemplate>
<DataTemplate x:Key="DriveDataTemplate" x:DataType="entities:Drive">
    <ContentPresenter>
        <StackPanel>
            <SymbolIcon Symbol="{x:Bind Icon}" />
            <TextBlock Text="{x:Bind Name}" />
        </StackPanel>
    </ContentPresenter>
</DataTemplate>
...