2017-01-18 4 views
0

Я видел что-то такое, что было сделано с {DynamicResource xyz} по какому-то другому вопросу, но, похоже, он не работает с UWP. Вот мой XAML:Как я могу ссылаться на DataTemplate в ресурсах UWP XAML?

<DataTemplate x:Key="commentTemplate"> 
    <StackPanel> 
     <Grid Margin="4" Background="#40606060" MinHeight="64"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="*" /> 
       <RowDefinition Height="auto" /> 
      </Grid.RowDefinitions> 
      <StackPanel> 
       <TextBlock Margin="4" FontSize="14" TextWrapping="WrapWholeWords" Text="{Binding Path=Message, Mode=OneWay}" /> 
       <Image MaxHeight="96" Source="{Binding Path=Image}" HorizontalAlignment="Left" Margin="4" /> 
      </StackPanel> 
      <StackPanel Background="#18808080" Orientation="Horizontal" Grid.Row="1"> 
       <FontIcon Margin="2,0" Glyph="&#xE19D;" /> 
       <TextBlock Margin="2,0" Text="{Binding Path=Score, Mode=OneWay}" /> 
       <Button Content="Reply" Margin="2,0" /> 
      </StackPanel> 
     </Grid> 
     <ItemsControl ItemTemplate="{RelativeSource Mode=Self}" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" Margin="48" ItemsSource="{Binding Path=Comments}" /> 
    </StackPanel> 
</DataTemplate> 

Я хотел бы самореференция DataTemplate в ItemsControl «s ItemTemplate собственности. Как я могу его заменить?

+0

Я не уверен, что у меня есть ответ, но вы можете попробовать это, замените ItemTemplate = "{RelativeSource Mode = Self}" с ItemTemplate = "{StaticResource commentTemplate}" или с помощью {Binding RelativeSource Mode = Self}. Дайте мне знать, если это сработает, я попробую. Кроме того, если вы могли бы предоставить данные spample JSON или что-то такое, чтобы я мог протестировать код –

+0

, я уже пробовал ссылаться на него '{StaticResource commentTemplate}', но, похоже, он не поддерживает саморегуляцию. Он всегда выдавал ошибку «Не могу найти ресурс ...». Я проверил ваше другое решение, и оно больше не вызывает исключение. Кажется, он работает, по крайней мере, частично. Когда я добавляю какие-либо вложенные комментарии, он пытается по какой-то причине преобразовать относительную привязку: ' – Reynevan

+0

' Ошибка: конвертеру не удалось преобразовать значение типа «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

ответ

1

Вот что-то, что может сработать для вас. Я использую это в нашем 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); 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^