xamarin datatemplateselector: недопустимое имя XAML

Я пытаюсь очень часто использовать Xamarin.Forms ListView, где у меня есть несколько типов элементов.

Я использую DataTemplateSelector и определяю разные (на данный момент два) представления в моем файле XAML. Для этого требуется ссылка на код C# из кода XAML через определение пространства имен. И вот где я застрял.

Ошибка, которую я получаю,

XFC0000 Cannot resolve type "local:NodeTemplateSelector".

Вот мой XAML, сжатый:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
             ...
             xmlns:local="clr-namespace:varlist">

  <ContentPage.Resources>
    <ResourceDictionary>
      
      <DataTemplate x:Key="NoteItem">
      ...
      </DataTemplate>

      <local:NodeTemplateSelector x:Key="NodeTemplateKey">
        NoteTemplate = "{StaticResource NoteItem}"
        ImageTemplate = "{StaticResource ImageItem}"
      </local:NodeTemplateSelector>

    </ResourceDictionary>
  </ContentPage.Resources>
</ContentPage>

А вот и C#, тоже в сжатом виде:

namespace varlist
{
  [XamlCompilation(XamlCompilationOptions.Compile)]
  public partial class ListViewPage : ContentPage
  {
    ...
    public class NodeTemplateSelector : DataTemplateSelector
    {
      public DataTemplate NoteTemplate { get; set; }
      public DataTemplate ImageTemplate { get; set; }

      protected override DataTemplate OnSelectTemplate (object item, BindableObject container)
      {
        ListView list = (ListView)container;
        if (item is NoteData)
          return NoteTemplate;
        else // item is ImageData
          return ImageTemplate;
      }
    }
  }
}

Что мне нужно изменить, чтобы XAML распознал NodeTemplateSelector?


person Peri Hartman    schedule 10.11.2020    source источник
comment
почему NodeTemplateSelector внутри класса ListViewPage?   -  person Jason    schedule 10.11.2020
comment
Я брал пример, кажется, с MS. Это скрывает символ? Он объявлен публичным.   -  person Peri Hartman    schedule 10.11.2020
comment
Как сказал Джейсон, попробуйте создать класс селектора в новом файле класса.   -  person Shaw    schedule 10.11.2020
comment
Да, это решило проблему. Спасибо.   -  person Peri Hartman    schedule 11.11.2020


Ответы (1)


Как предположили Джейсон и Шоу, NodeTemplateSelector должен относиться к классу верхнего уровня.

Кроме того, еще одна проблема, с которой я столкнулся, — это синтаксис в XAML-файле DataTemplate. Можно также добавить это примечание, на случай, если у кого-то еще возникнет такая же проблема:

NodeTemplateSelector в XAML должен быть определен как прямое содержимое; должно быть так:

  <local:NodeTemplateSelector 
    x:Key="NodeTemplate"
    NoteItemTemplate="{StaticResource NoteTemplate}"
    ImageItemTemplate="{StaticResource ImageTemplate}"
  />

В противном случае вы получите довольно неразборчивую ошибку времени выполнения.

person Peri Hartman    schedule 10.11.2020