xamarin datatemplateselector:无效的XAML名称

xamarin datatemplateselector:无效的XAML名称,xaml,xamarin.forms,datatemplateselector,Xaml,Xamarin.forms,Datatemplateselector,我正在尝试使用Xamarin.Forms ListView的一个非常常见的用法,在这里我有多种类型的项 我正在使用DataTemplateSelector并在XAML文件中定义不同的(目前有两个)视图。这需要通过名称空间定义从XAML代码中引用c#代码。这就是我被困的地方 我得到的错误是 XFC0000 Cannot resolve type "local:NodeTemplateSelector". 这是我的XAML,浓缩版: <?xml version="

我正在尝试使用Xamarin.Forms ListView的一个非常常见的用法,在这里我有多种类型的项

我正在使用DataTemplateSelector并在XAML文件中定义不同的(目前有两个)视图。这需要通过名称空间定义从XAML代码中引用c#代码。这就是我被困的地方

我得到的错误是

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>
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,我需要做哪些更改?

正如Jason和Shaw所建议的,NodeTemplateSelector必须在顶级类中

另外,我遇到的另一个问题是DataTemplate XAML文件中的语法。如果其他人也有同样的问题,不妨添加此注释:

XAML中的NodeTemplateSelector必须定义为直接内容;必须是这样的:

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


否则会出现一个无法解释的运行时错误。

为什么
NodeTemplateSelector
在类
ListViewPage
中?我想我是在遵循一个来自MS的示例。这是隐藏符号吗?它被声明为公共的。正如Jason所说,尝试在一个新的类文件中创建选择器类。是的,这解决了问题。谢谢