问题描述
我正在尝试使用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>
而且,这里是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?
解决方法
正如Jason和Shaw所建议的那样,NodeTemplateSelector必须在顶级类中。
此外,我遇到的另一个问题是DataTemplate XAML文件中的语法。如果其他人遇到同样的麻烦,也可以添加此注释:
XAML中的NodeTemplateSelector必须定义为直接内容;必须是这样的:
def add_item(self,item_name: str,*args,**kwargs):
"""Add item to this group.
__________
Parameters
item_name : `str`
The new item's name.
args : `tuple`
The list of item fields to return.
kwargs : `dict`
Optional keyword arguments for adding an item to this group.
否则,您将获得一个难以理解的运行时错误。