UWP NavigationView的TemplateSelector

时间:2019-03-21 19:21:49

标签: c# xaml uwp windows-10

如何为UWP NavigationView正确使用MenuItemTemplateSelector? 我从互联网上查找了一些示例并进行了尝试(下面的代码)。但是它不起作用,因为它应该只打印类名。 目前,我正在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 :(得分:0)

查看此链接。

Cannot bind Icon property in 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>

答案 1 :(得分:0)

在查看了上面的链接后,我决定将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放置为第一个孩子。