UWP TreeView ItemTemplateSelector не работает - PullRequest
0 голосов
/ 24 мая 2018

WPF-версия этого вопроса здесь: Но на него не было ответа, и я не знаю, будет ли у UWP TreeView такой же ответ.

ЯПопытка добавить DataTemplateSelector к новым UWP TreeView, которые были только что добавлены в Windows 10 версии 1803, но это не работает.Здесь задокументировано здесь , как использовать элемент управления TreeView XAML, и даже показано, как изменить шаблон для изменения таблицы данных элемента, которая работает нормально.Мне нужно использовать селектор таблицы данных, поскольку каждый из моих узлов использует разные объекты, и мне нужно, чтобы они отображались по-разному.TreeView.Node.Content устанавливается просто отлично, и все работает, за исключением того, что он передает null в datatemplateselector в параметре Object.

Вот мой код: (такой же, как в примере от Microsoft только с использованием ItemTemplateSelector)

<Style TargetType="TreeView">
        <Setter Property="IsTabStop" Value="False" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TreeView">
                    <TreeViewList x:Name="ListControl"
                                      ItemTemplateSelector="{StaticResource CardSelector}"
                                      ItemContainerStyle="{StaticResource TreeViewItemStyle}"
                                      CanDragItems="True"
                                      AllowDrop="True"
                                      CanReorderItems="True">
                        <TreeViewList.ItemContainerTransitions>
                            <TransitionCollection>
                                <ContentThemeTransition />
                                <ReorderThemeTransition />
                                <EntranceThemeTransition IsStaggeringEnabled="False" />
                            </TransitionCollection>
                        </TreeViewList.ItemContainerTransitions>
                    </TreeViewList>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

У кого-нибудь есть понимание или опыт по этому поводу?Мой селектор данных «CardSelector» работает нормально, и я без проблем использую его в нескольких местах.

1 Ответ

0 голосов
/ 01 июня 2018

Так что суть моего вопроса не в том, чтобы получить что-то, что у меня работает, а в том, чтобы проверить, работает ли TreeViewControl с DataTemplateSelector.У меня есть только «CardTemplateSelector», потому что я использую его в нескольких других местах моего приложения, и я знаю, что он работает.Мой вопрос на самом деле «да, древовидная структура работает с селектором» или «нет, это не так». Я действительно ищу кого-то еще, чтобы попробовать его со своим собственным селектором тестовых шаблонов и дать мне знать, могут ли они заставить его работать,Любой конкретный код от меня не имеет отношения к вопросу.Просто посмотрите, сможете ли вы заставить его работать с любым селектором, который вам нужен

Да.TreeView хорошо работает с ItemTemplateSelector.

. Я использовал весь код в документе и создал собственный класс, подобный следующему:

public class Test
{
    public string Name { get; set; }
}

Я сделал другойНапример, DataTemplate:

<DataTemplate x:Key="TreeViewObjDataTemplate">
        <Grid Height="44">
            <TextBlock
                Text="{Binding Content.Name}"
                HorizontalAlignment="Left"
                VerticalAlignment="Center"
                Style="{ThemeResource BodyTextBlockStyle}"/>
        </Grid>
</DataTemplate>

Мой CardTemplateSelector класс выглядит следующим образом:

public class CardTemplateSelector: DataTemplateSelector
{
    public DataTemplate TreeViewItemDataTemplate { get; set; }
    public DataTemplate TreeViewObjDataTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item)
    {
        TreeViewNode treeViewNode = item as TreeViewNode;
        if (treeViewNode.Content is StorageFolder|| treeViewNode.Content is StorageFile)
        {
            return TreeViewItemDataTemplate;
        }
        if (treeViewNode.Content is Test)
        {
            return TreeViewObjDataTemplate;
        }

        return base.SelectTemplateCore(item);
    }

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

Я просто добавляю код новой строки в MainPage.xaml.cs:

TreeViewNode objnode = new TreeViewNode();
Test test = new Test() {Name="Parent"};
objnode.Content = test;
objnode.IsExpanded = true;
objnode.HasUnrealizedChildren = true;
sampleTreeView.RootNodes.Add(objnode);

Ниже приводится полный код ресурса страницы xaml:

    <Page.Resources>
    <DataTemplate x:Key="TreeViewItemDataTemplate">
        <Grid Height="44">
            <TextBlock
                Text="{Binding Content.DisplayName}"
                HorizontalAlignment="Left"
                VerticalAlignment="Center"
                Style="{ThemeResource BodyTextBlockStyle}"/>
        </Grid>
    </DataTemplate>

    <DataTemplate x:Key="TreeViewObjDataTemplate">
        <Grid Height="44">
            <TextBlock
                Text="{Binding Content.Name}"
                HorizontalAlignment="Left"
                VerticalAlignment="Center"
                Style="{ThemeResource BodyTextBlockStyle}"/>
        </Grid>
    </DataTemplate>

    <local:CardTemplateSelector x:Name="CardTemplateSelector" TreeViewItemDataTemplate="{StaticResource TreeViewItemDataTemplate}" TreeViewObjDataTemplate="{StaticResource TreeViewObjDataTemplate}"></local:CardTemplateSelector>

    <Style TargetType="TreeView">
        <Setter Property="IsTabStop" Value="False" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TreeView">
                    <TreeViewList x:Name="ListControl"
                                  ItemTemplateSelector="{StaticResource CardTemplateSelector}"
                                  ItemContainerStyle="{StaticResource TreeViewItemStyle}"
                                  CanDragItems="True"
                                  AllowDrop="True"
                                  CanReorderItems="True">
                        <TreeViewList.ItemContainerTransitions>
                            <TransitionCollection>
                                <ContentThemeTransition />
                                <ReorderThemeTransition />
                                <EntranceThemeTransition IsStaggeringEnabled="False" />
                            </TransitionCollection>
                        </TreeViewList.ItemContainerTransitions>
                    </TreeViewList>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Page.Resources>

enter image description here

Пока я уже ответил на ваш вопрос.Но я все же хочу сообщить вам Как задать хороший вопрос .В моих комментариях выше я попросил вас предоставить соответствующий код, и тогда я смогу быстро воспроизвести ваш вопрос и помочь вам его диагностировать.Но ты сказал I'm really looking for someone else to try it with their own test template selector and to let me know if they can get it working..Все нормально.Вы могли видеть, что только я ответил.Вы задавали этот вопрос в течение многих дней.Другие члены сообщества не помогли вам в этом вопросе.Вот почему я прошу вас разместить здесь некоторый код.Если вы предоставите соответствующий код здесь, я думаю, что многие члены сообщества будут рады помочь вам в этом вопросе.Я действительно надеюсь, что вы могли понять это.

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