Скажите, пожалуйста, как тут реализовать 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">
<Page.Resources>
<local:MyDataTempletSelector x:Key="MyDataTemplet">
<local:MyDataTempletSelector.GradientTemplate>
<DataTemplate >
<ListView>
</ListView>
</DataTemplate>
</local:MyDataTempletSelector.GradientTemplate>
<local:MyDataTempletSelector.IconTeamplate>
<DataTemplate x:DataType="local:Detail" >
<ListView>
<StackPanel>
<Image Source="{x:Bind IconUrl,Mode=OneWay}" Width="50" Height="50"/>
</StackPanel>
</ListView>
</DataTemplate>
</local:MyDataTempletSelector.IconTeamplate>
<local:MyDataTempletSelector.ColorTemplate>
<DataTemplate x:DataType="local:Detail" >
<ListView>
<Border Background="{x:Bind IconList ,Mode=OneWay}" Width="25" Height="25" />
</ListView>
</DataTemplate>
</local:MyDataTempletSelector.ColorTemplate>
</local:MyDataTempletSelector>
</Page.Resources>
<ListBox>
<ListView
ItemsSource = "{x:Bind Tittle }"
ItemTemplateSelector = "{StaticResource MyDataTemplet}" ItemClick="MyListView_ItemClick">
</ListView>
</ListBox>
</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;
}
}
}
DataTemplateSelector", но внятного ответа я так и не получил. Вы сами себе стреляете в ногу с ним, ибо тут достаточноDataTemplateс указанием типа и вида, который вам нужен, не более, но нет, вы хотите селектор... – EvgeniyZ Sep 05 '20 at 15:51List<Root> Tittle, аList<>не имеет реализации оповещения UI об изменениях, то есть при добавление или удаление туда чего либо, вы не увидите изменения в UI. Решение - используйтеObservableCollection<>илиBindingList<>, они из коробки реализуютINotifyCollectionChanged. – EvgeniyZ Sep 05 '20 at 16:16DataContext(надеюсь установлен) и привязки работают. 3. Я быDataTemplateвынес в отдельные ресурсы и сделал бы так, как показано в документации.