Вот что-то, что может сработать для вас. Я использую это в нашем POS-приложении, хотя это моя первая попытка его вложенности. Дизайнер xaml жалуется из-за ссылки на селектор StaticResource до его объявления, но он работает во время выполнения.
По существу, я использую это, чтобы выбрать другой шаблон данных, основанный на классе, привязанном к элементу. В этом случае существует только один тип, поэтому мы просто используем тип класса, чтобы решить, какой шаблон использовать.
MyModel:
public class MyModel
{
public int Id { get; set; }
public string Desc { get; set; }
public List<MyModel> Children { get; set; }
}
MyTemplateSelector:
public class MyTemplateSelector : DataTemplateSelector
{
public DataTemplate MyModelTemplate { get; set; }
protected override DataTemplate SelectTemplateCore(object item)
{
if (item is MyModel)
{
return MyModelTemplate;
}
else
{
return null;
}
}
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
return SelectTemplateCore(item);
}
}
Мои MainPage:
<Page
x:Class="App7.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App7"
xmlns:models="using:App7.Models"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<DataTemplate x:Key="myModelTemplate" x:DataType="models:MyModel">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Text="{x:Bind Path=Desc, Mode=OneWay}" />
<ListView Grid.Row="1" ItemTemplateSelector="{StaticResource selector}" ItemsSource="{x:Bind Path=Children, Mode=OneWay}" />
</Grid>
</DataTemplate>
<local:MyTemplateSelector x:Key="selector" MyModelTemplate="{StaticResource myModelTemplate}" />
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ListView x:Name="lstView" ItemTemplateSelector="{StaticResource selector}" >
</ListView>
</Grid>
</Page>
Мой код позади:
public sealed partial class MainPage : Page
{
List<MyModel> lst { get; set; }
public MainPage()
{
this.InitializeComponent();
BuildList();
lstView.ItemsSource = lst;
}
private void BuildList()
{
lst = new List<MyModel>();
for (int i = 0; i < 10; i++)
{
MyModel mod = new MyModel();
mod.Id = i;
mod.Desc = "Desc" + i.ToString();
mod.Children = new List<MyModel>();
for (int j = 100; j < 102; j++)
{
MyModel mod2 = new MyModel();
mod2.Id = j;
mod2.Desc = "Desc" + j.ToString();
mod2.Children = new List<MyModel>();
for (int k = 1000; k < 1002; k++)
{
MyModel mod3 = new MyModel();
mod3.Id = k;
mod3.Desc = "Desc" + k.ToString();
mod3.Children = new List<MyModel>();
mod2.Children.Add(mod3);
}
mod.Children.Add(mod2);
}
lst.Add(mod);
}
}
}
Я не уверен, что у меня есть ответ, но вы можете попробовать это, замените ItemTemplate = "{RelativeSource Mode = Self}" с ItemTemplate = "{StaticResource commentTemplate}" или с помощью {Binding RelativeSource Mode = Self}. Дайте мне знать, если это сработает, я попробую. Кроме того, если вы могли бы предоставить данные spample JSON или что-то такое, чтобы я мог протестировать код –
, я уже пробовал ссылаться на него '{StaticResource commentTemplate}', но, похоже, он не поддерживает саморегуляцию. Он всегда выдавал ошибку «Не могу найти ресурс ...». Я проверил ваше другое решение, и оно больше не вызывает исключение. Кажется, он работает, по крайней мере, частично. Когда я добавляю какие-либо вложенные комментарии, он пытается по какой-то причине преобразовать относительную привязку: ' – Reynevan
' Ошибка: конвертеру не удалось преобразовать значение типа «Windows.UI.Xaml.Controls.ItemsControl» для ввода «DataTemplate»; BindingExpression: Path = '' DataItem = 'Windows.UI.Xaml.Controls.ItemsControl'; целевым элементом является «Windows.UI.Xaml.Controls.ItemsControl» (Name = 'null'); target свойство «ItemTemplate» (тип «DataTemplate»). ' – Reynevan