0

Скажите, пожалуйста, как тут реализовать DataTemplateSelector я пытаюсь по нажатию на элемент из ListView показать его содержимое и почему-то Selector не возвращает нужные мне данные.

Вот мой класс MyDataTemplateSelector на C#

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace Task2 { public class MyDataTempletSelector : DataTemplateSelector { public DataTemplate ColorTemplate { get; set;} public DataTemplate IconTeamplate {get; set;} public DataTemplate GradientTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        ListView listView = new ListView();
        Root root = new Root();
        if (root.Type == TypeEnum.Color)
        {
            return ColorTemplate;
        }
        else if (root.Type == TypeEnum.Gradient)
        {
            return GradientTemplate;
        }
        else if (root.Type == TypeEnum.Pattern)
        {
            return IconTeamplate;
        }
        return base.SelectTemplateCore(item, container);
    }

}

}

XAML

<Page
    x:Class="Task2.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Task2"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" d:DesignWidth="1538.183" d:DesignHeight="893.986">
&lt;Page.Resources&gt;
    &lt;local:MyDataTempletSelector x:Key=&quot;MyDataTemplet&quot;&gt;
        &lt;local:MyDataTempletSelector.GradientTemplate&gt;
            &lt;DataTemplate &gt;
                &lt;ListView&gt;

                &lt;/ListView&gt;
            &lt;/DataTemplate&gt;
        &lt;/local:MyDataTempletSelector.GradientTemplate&gt;
        &lt;local:MyDataTempletSelector.IconTeamplate&gt;
            &lt;DataTemplate x:DataType=&quot;local:Detail&quot; &gt;
                &lt;ListView&gt;
                    &lt;StackPanel&gt;
                        &lt;Image Source=&quot;{x:Bind IconUrl,Mode=OneWay}&quot; Width=&quot;50&quot; Height=&quot;50&quot;/&gt;
                    &lt;/StackPanel&gt;
                &lt;/ListView&gt;
            &lt;/DataTemplate&gt;
        &lt;/local:MyDataTempletSelector.IconTeamplate&gt;

        &lt;local:MyDataTempletSelector.ColorTemplate&gt;
            &lt;DataTemplate x:DataType=&quot;local:Detail&quot; &gt;
                &lt;ListView&gt;
                    &lt;Border Background=&quot;{x:Bind IconList ,Mode=OneWay}&quot; Width=&quot;25&quot; Height=&quot;25&quot; /&gt;
                &lt;/ListView&gt;
            &lt;/DataTemplate&gt;
        &lt;/local:MyDataTempletSelector.ColorTemplate&gt;
    &lt;/local:MyDataTempletSelector&gt;
&lt;/Page.Resources&gt;

&lt;ListBox&gt;
    &lt;ListView  
      ItemsSource = &quot;{x:Bind Tittle }&quot; 
      ItemTemplateSelector = &quot;{StaticResource MyDataTemplet}&quot; ItemClick=&quot;MyListView_ItemClick&quot;&gt;
    &lt;/ListView&gt;

&lt;/ListBox&gt;

</Page>

MainPage

 public sealed partial class MainPage : Page
    {
        public List<Root> Tittle { get; set; } = new List<Root>();
        public Root[] RootObject { get; set; }
        public List<Detail> ColorList { get; set; } = new List<Detail>();
        public List<Detail> IconList { get; set; } = new List<Detail>();
        public List<GradientProps> gradientProps { get; set; } = new List<GradientProps>();
        // ObservableCollection<Root> RootObjToList { get; set;}
        public MainPage()
        {
            this.InitializeComponent();
            string FilePath = Path.Combine(Package.Current.InstalledLocation.Path, "Class1.json");
            using (StreamReader file = File.OpenText(FilePath))
            {
                var json = file.ReadToEnd();
                RootObject = JsonConvert.DeserializeObject<Root[]>(json);
                foreach (var item in RootObject)
                {
                    Tittle.Add(new Root
                    {
                        Title = item.Title
                    });
            }
            foreach (var items in RootObject)
            {
                foreach (var item in items.Details)
                {
                    switch (item.DetailType)
                    {
                        case TypeEnum.Pattern:
                            IconList.Add(new Detail
                            {
                                IconUrl = item.IconUrl
                            });
                            break;
                        case TypeEnum.Color:
                            ColorList.Add(new Detail
                            {
                                FillColor = item.FillColor
                            });
                            break;
                        case TypeEnum.Gradient:
                            gradientProps.Add(new GradientProps
                            {
                                GradientStop1 = item.GradientProps.GradientStop1
                            });
                            break;
                    }
                }

}

Casper
  • 1,228
  • 9
  • 19
  • Вы знаете, что 2 аккаунта на SO это не хорошо? И это карается блокировкой/удалением одного из них... – EvgeniyZ Sep 04 '20 at 22:30
  • 1
    @ EvgeniyZ ну вот я уже несколько дней пытаюсь решить эту задачу не получаеться , все свое время почти трачу на это если не трудно подскажи как разобраться с этим ? –  Sep 05 '20 at 15:24
  • Простите, может грубо будет, но я не горю желанием помогать тому, кто нарушает правила сообщества, в котором я нахожусь. Также мне не ясна ваша проблема, а вы, не помогаете ее понять. Я уже спрашивал у одного из ваших аккаунтов, "зачем вам DataTemplateSelector", но внятного ответа я так и не получил. Вы сами себе стреляете в ногу с ним, ибо тут достаточно DataTemplate с указанием типа и вида, который вам нужен, не более, но нет, вы хотите селектор... – EvgeniyZ Sep 05 '20 at 15:51
  • Насчет правил я согласен с вами учту ваши слова теперь не только не нарушать, но и сам буду следить что бы их не нарушали. а насчет задачи может я не совсем ее понимаю да возможно без DataTemplateSelector можно ее легче решить но так она поставлена что обязательно это использовать, я много читаю в разных статьях смотрел просто. С UWP сталкиваюсь первый раз. –  Sep 05 '20 at 16:07
  • Ну как я говорил, ваша задача решается так, без каких либо селекторов, кто у вас там требует его - на кол надо, ибо советует лишнюю ересь (ИМХО). Если брать ваш код, то тут пара замечаний: 1. Привязка идет к List<Root> Tittle, а List<> не имеет реализации оповещения UI об изменениях, то есть при добавление или удаление туда чего либо, вы не увидите изменения в UI. Решение - используйте ObservableCollection<> или BindingList<>, они из коробки реализуют INotifyCollectionChanged. – EvgeniyZ Sep 05 '20 at 16:16
  • Я не вижу у вас DataContext (надеюсь установлен) и привязки работают. 3. Я бы DataTemplate вынес в отдельные ресурсы и сделал бы так, как показано в документации.
  • – EvgeniyZ Sep 05 '20 at 16:18