UWP TreeView ItemTempleteSelector не выполняется - PullRequest
0 голосов
/ 30 мая 2019

TreeView, над которым я работаю, не выполняет ItemTemplateSelector, независимо от того, объявил ли я его в XAML и коде.

Вот ресурсы моей страницы в XAML:

<DataTemplate x:Key="FolderTemplate" x:DataType="localdata:FolderInfo">
        <TreeViewItem ItemsSource="{x:Bind subFolders}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="#Folder#" />
                <Image Width="20" Source="Assets/img2.png"/>
                <TextBlock Text="{x:Bind  FolderName }" />
            </StackPanel>
        </TreeViewItem>
    </DataTemplate>

    <DataTemplate x:Key="FileTemplate" x:DataType="localdata:FolderInfo">
        <TreeViewItem>
            <StackPanel Orientation="Horizontal">
                <Image Width="20" Source="Assets/img3.png"/>
                <TextBlock Text="{x:Bind FolderName}"/>
            </StackPanel>
        </TreeViewItem>
    </DataTemplate>


    <localdata:ExplorerItemTemplateSelector
        x:Key="ExplorerItemTemplateSelector"
        FolderTemplate="{StaticResource FolderTemplate}"
        FileTemplate="{StaticResource FileTemplate}" />

Вот объявление TreeView, оно использует Style, но оно не имеет значения для этого обзора:

<TreeView   
        x:Name="treeview" Grid.Row="2" ItemsSource="{Binding storageFolders,Mode=OneWay}" 
        Style="{StaticResource TreeViewStyle1}"
        ItemTemplateSelector="{StaticResource ExpolrerItemTemplateSelector}"
        >
            <TreeView.ItemTemplate>
                <DataTemplate x:DataType="localdata:FolderInfo">
                    <TreeViewItem ItemsSource="{x:Bind subFolders}" Content="{x:Bind FolderName}"/>
                </DataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

и в моем коде за файлом:

public class ExplorerItemTemplateSelector : DataTemplateSelector
{
    public DataTemplate FolderTemplate { get; set; }
    public DataTemplate FileTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        var explorerItem = (FolderInfo)item;
        if (explorerItem.IsFolder == true) return FolderTemplate;

        return FileTemplate;
    }
}

Привязки работают нормально. Я пропустил VM из этого обзора, чтобы удалить беспорядок. Также интересно то, что если я уберу ItemTemplateSelector="{StaticResource ExpolrerItemTemplateSelector}" из объявления TreeView, он будет работать без каких-либо изменений в визуальном или функциональном смысле.

1 Ответ

2 голосов
/ 30 мая 2019

Тип DataTemplateSelector на самом деле имеет две различные перегрузки метода SelectTemplateCore, а TreeView использует вторую только с одним параметром object:

public class ExplorerItemTemplateSelector : DataTemplateSelector
{
    public DataTemplate FolderTemplate { get; set; }
    public DataTemplate FileTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item)
    {
        var explorerItem = (FolderInfo)item;
        if (explorerItem.IsFolder == true) return FolderTemplate;

        return FileTemplate;
    }
}

В этой форме метод долженбыть вызванным, как ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...