如何将 ListView's/CollectionView 的 DataTemplate 绑定到 ViewModel 属性
How to bind a ListView's/CollectionView's DataTemplate to a ViewModel Property
我正在构建一个供内部使用的 Xamarin Forms 控件库,我正在尝试将 DataTemplate 定义为可绑定的 属性,它通过 ViewModel 传递并设置为 CollectionView。当我这样做时,我在 Xamarin Forms 非托管代码的深处得到了一个 NRE,但我没有得到关于在捕获的异常中导致 NRE 的具体信息。所以这让我想知道这是否有可能做到。我在网上找到的所有例子都是直接设置ItemTemplate,从来没有绑定属性。那么,这是可行的吗?
这是Xamarin.Forms代码中出现异常的地方
// Set the binding context _before_ we create the renderer; that way, it's available during OnElementChanged
view.BindingContext = bindingContext;
属性 似乎是可绑定的 属性 所以我认为这应该可以正常工作。
public static readonly BindableProperty ItemTemplateProperty;
集合视图...
<CollectionView Grid.Row="3"
Margin="16,0,16,16"
ItemTemplate="{Binding ItemTemplate}" <--- this is what I am trying to make work
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem}"
SelectionChangedCommand="{Binding SelectedItemChanged}"
SelectionMode="Single"
VerticalOptions="Center"
VerticalScrollBarVisibility="Always" />
查看模型...
private DataTemplate _itemTemplate;
public DataTemplate ItemTemplate
{
get
{
return _itemTemplate;
}
set
{
SetProperty(ref _itemTemplate, value);
}
}
...
ItemTemplate = new DataTemplate(() =>
{
var grid = new Grid();
var nameLabel = new Label { FontAttributes = FontAttributes.Bold };
var ageLabel = new Label();
var locationLabel = new Label { HorizontalTextAlignment = TextAlignment.End };
nameLabel.SetBinding(Label.TextProperty, "Title");
ageLabel.SetBinding(Label.TextProperty, "Sybtitle");
locationLabel.SetBinding(Label.TextProperty, "Title");
grid.Children.Add(nameLabel);
grid.Children.Add(ageLabel, 1, 0);
grid.Children.Add(locationLabel, 2, 0);
return new ViewCell { View = grid };
});
列出项目模型...
public class ListPickerListItem {
public ListPickerListItem(string title, string subtitle = "", string icon = "", string image = "")
{
Title = title;
Subtitle = subtitle;
Icon = icon;
Image = image;
}
public string Title { get; set; }
public string Subtitle { get; set; }
public string Icon { get; set; }
public string Image { get; set; }
// prioritize the Image over the Icon since the Image has a default placeholder
public bool IsIconVisible { get { return string.IsNullOrEmpty(Icon) == false && string.IsNullOrEmpty(Image); } }
public bool IsImageVisible { get { return string.IsNullOrEmpty(Image) == false; } }
}
异常堆栈...
at Xamarin.Forms.Platform.iOS.TemplatedCell.Bind (Xamarin.Forms.DataTemplate template, System.Object bindingContext, Xamarin.Forms.ItemsView itemsView) [0x00068] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\TemplatedCell.cs:117
at Xamarin.Forms.Platform.iOS.ItemsViewController`1[TItemsView].UpdateTemplatedCell (Xamarin.Forms.Platform.iOS.TemplatedCell cell, Foundation.NSIndexPath indexPath) [0x0007b] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewController.cs:262
at Xamarin.Forms.Platform.iOS.ItemsViewController`1[TItemsView].CreateMeasurementCell (Foundation.NSIndexPath indexPath) [0x0007b] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewController.cs:587
at Xamarin.Forms.Platform.iOS.ItemsViewController`1[TItemsView].GetPrototype () [0x0005d] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewController.cs:362
at Xamarin.Forms.Platform.iOS.ItemsViewLayout.DetermineCellSize () [0x00060] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewLayout.cs:211
at Xamarin.Forms.Platform.iOS.ListViewLayout.ConstrainTo (CoreGraphics.CGSize size) [0x0001e] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ListViewLayout.cs:16
at Xamarin.Forms.Platform.iOS.ItemsViewLayout.SetInitialConstraints (CoreGraphics.CGSize size) [0x00007] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewLayout.cs:111
at Xamarin.Forms.Platform.iOS.ItemsViewController`1[TItemsView].EnsureLayoutInitialized () [0x00044] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewController.cs:192
at Xamarin.Forms.Platform.iOS.ItemsViewController`1[TItemsView].ViewDidLoad () [0x00035] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewController.cs:148
at (wrapper managed-to-native) ObjCRuntime.Messaging.IntPtr_objc_msgSendSuper(intptr,intptr)
at UIKit.UIViewController.get_View () [0x0002a] in /Users/builder/azdo/_work/1/s/xamarin-macios/src/build/ios/native/UIKit/UIViewController.g.cs:3265
at Xamarin.Forms.Platform.iOS.ItemsViewRenderer`2[TItemsView,TViewController].SetUpNewElement (TItemsView newElement) [0x00022] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewRenderer.cs:102
at Xamarin.Forms.Platform.iOS.StructuredItemsViewRenderer`2[TItemsView,TViewController].SetUpNewElement (TItemsView newElement) [0x00000] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\StructuredItemsViewRenderer.cs:41
at Xamarin.Forms.Platform.iOS.SelectableItemsViewRenderer`2[TItemsView,TViewController].SetUpNewElement (TItemsView newElement) [0x00000] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\SelectableItemsViewRenderer.cs:34
at Xamarin.Forms.Platform.iOS.ItemsViewRenderer`2[TItemsView,TViewController].OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs`1[TElement] e) [0x0000c] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewRenderer.cs:36
at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].SetElement (TElement element) [0x00172] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementRenderer.cs:296
at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.iOS.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00000] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementRenderer.cs:158
at Xamarin.Forms.Platform.iOS.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x00032] in D:\a\s\Xamarin.Forms.Platform.iOS\Platform.cs:240
at Xamarin.Forms.Platform.iOS.VisualElementPackager.OnChildAdded (Xamarin.Forms.VisualElement view) [0x0003e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementPackager.cs:115
at Xamarin.Forms.Platform.iOS.VisualElementPackager.Load () [0x0001e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementPackager.cs:49
at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].SetElement (TElement element) [0x0012e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementRenderer.cs:283
at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.iOS.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00000] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementRenderer.cs:158
at Xamarin.Forms.Platform.iOS.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x00032] in D:\a\s\Xamarin.Forms.Platform.iOS\Platform.cs:240
at Xamarin.Forms.Platform.iOS.VisualElementPackager.OnChildAdded (Xamarin.Forms.VisualElement view) [0x0003e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementPackager.cs:115
at Xamarin.Forms.Platform.iOS.VisualElementPackager.Load () [0x0001e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementPackager.cs:49
at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].SetElement (TElement element) [0x0012e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementRenderer.cs:283
at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.iOS.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00000] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementRenderer.cs:158
at Xamarin.Forms.Platform.iOS.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x00032] in D:\a\s\Xamarin.Forms.Platform.iOS\Platform.cs:240
at Xamarin.Forms.Platform.iOS.VisualElementPackager.OnChildAdded (Xamarin.Forms.VisualElement view) [0x0003e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementPackager.cs:115
at Xamarin.Forms.Platform.iOS.VisualElementPackager.Load () [0x0001e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementPackager.cs:49
at Xamarin.Forms.Platform.iOS.PageRenderer.ViewDidLoad () [0x0008f] in D:\a\s\Xamarin.Forms.Platform.iOS\Renderers\PageRenderer.cs:251
at Rg.Plugins.Popup.IOS.Renderers.PopupPageRenderer.ViewDidLoad () [0x00000] in Z:\Documents\OpenSource\Rg.Plugins.Popup\Rg.Plugins.Popup\Platforms\Ios\Renderers\PopupPageRenderer.cs:74
at (wrapper managed-to-native) ObjCRuntime.Messaging.IntPtr_objc_msgSendSuper(intptr,intptr)
at UIKit.UIViewController.get_View () [0x0002a] in /Users/builder/azdo/_work/1/s/xamarin-macios/src/build/ios/native/UIKit/UIViewController.g.cs:3265
at Xamarin.Forms.Platform.iOS.PageRenderer.get_NativeView () [0x00000] in D:\a\s\Xamarin.Forms.Platform.iOS\Renderers\PageRenderer.cs:103
at Xamarin.Forms.Platform.iOS.PageRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x0003d] in D:\a\s\Xamarin.Forms.Platform.iOS\Renderers\PageRenderer.cs:119
at Xamarin.Forms.Platform.iOS.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x00032] in D:\a\s\Xamarin.Forms.Platform.iOS\Platform.cs:240
at Rg.Plugins.Popup.IOS.Extensions.PlatformExtension.GetOrCreateRenderer (Xamarin.Forms.VisualElement bindable) [0x0000a] in Z:\Documents\OpenSource\Rg.Plugins.Popup\Rg.Plugins.Popup\Platforms\Ios\Extensions\PlatformExtension.cs:21
at Rg.Plugins.Popup.IOS.Impl.PopupPlatformIos.AddAsync (Rg.Plugins.Popup.Pages.PopupPage page) [0x00052] in Z:\Documents\OpenSource\Rg.Plugins.Popup\Rg.Plugins.Popup\Platforms\Ios\Impl\PopupPlatformIos.cs:55
at Rg.Plugins.Popup.Services.PopupNavigationImpl.AddAsync (Rg.Plugins.Popup.Pages.PopupPage page) [0x00000] in Z:\Documents\OpenSource\Rg.Plugins.Popup\Rg.Plugins.Popup\Services\PopupNavigationImpl.cs:175
at Rg.Plugins.Popup.Services.PopupNavigationImpl+<>c__DisplayClass20_0.<PushAsync>b__0 () [0x00047] in Z:\Documents\OpenSource\Rg.Plugins.Popup\Rg.Plugins.Popup\Services\PopupNavigationImpl.cs:73
感谢@FabriBertani the link,它指出了异常的原因。 “使用 CollectionView 时,切勿将 DataTemplate 对象的根元素设置为 ViewCell。这将导致抛出异常,因为 CollectionView 没有单元格的概念。”将模板的外部视图设为 Grid 而不是不受支持的 Cell 可解决此问题。
我正在构建一个供内部使用的 Xamarin Forms 控件库,我正在尝试将 DataTemplate 定义为可绑定的 属性,它通过 ViewModel 传递并设置为 CollectionView。当我这样做时,我在 Xamarin Forms 非托管代码的深处得到了一个 NRE,但我没有得到关于在捕获的异常中导致 NRE 的具体信息。所以这让我想知道这是否有可能做到。我在网上找到的所有例子都是直接设置ItemTemplate,从来没有绑定属性。那么,这是可行的吗?
这是Xamarin.Forms代码中出现异常的地方
// Set the binding context _before_ we create the renderer; that way, it's available during OnElementChanged
view.BindingContext = bindingContext;
属性 似乎是可绑定的 属性 所以我认为这应该可以正常工作。
public static readonly BindableProperty ItemTemplateProperty;
集合视图...
<CollectionView Grid.Row="3"
Margin="16,0,16,16"
ItemTemplate="{Binding ItemTemplate}" <--- this is what I am trying to make work
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem}"
SelectionChangedCommand="{Binding SelectedItemChanged}"
SelectionMode="Single"
VerticalOptions="Center"
VerticalScrollBarVisibility="Always" />
查看模型...
private DataTemplate _itemTemplate;
public DataTemplate ItemTemplate
{
get
{
return _itemTemplate;
}
set
{
SetProperty(ref _itemTemplate, value);
}
}
...
ItemTemplate = new DataTemplate(() =>
{
var grid = new Grid();
var nameLabel = new Label { FontAttributes = FontAttributes.Bold };
var ageLabel = new Label();
var locationLabel = new Label { HorizontalTextAlignment = TextAlignment.End };
nameLabel.SetBinding(Label.TextProperty, "Title");
ageLabel.SetBinding(Label.TextProperty, "Sybtitle");
locationLabel.SetBinding(Label.TextProperty, "Title");
grid.Children.Add(nameLabel);
grid.Children.Add(ageLabel, 1, 0);
grid.Children.Add(locationLabel, 2, 0);
return new ViewCell { View = grid };
});
列出项目模型...
public class ListPickerListItem {
public ListPickerListItem(string title, string subtitle = "", string icon = "", string image = "")
{
Title = title;
Subtitle = subtitle;
Icon = icon;
Image = image;
}
public string Title { get; set; }
public string Subtitle { get; set; }
public string Icon { get; set; }
public string Image { get; set; }
// prioritize the Image over the Icon since the Image has a default placeholder
public bool IsIconVisible { get { return string.IsNullOrEmpty(Icon) == false && string.IsNullOrEmpty(Image); } }
public bool IsImageVisible { get { return string.IsNullOrEmpty(Image) == false; } }
}
异常堆栈...
at Xamarin.Forms.Platform.iOS.TemplatedCell.Bind (Xamarin.Forms.DataTemplate template, System.Object bindingContext, Xamarin.Forms.ItemsView itemsView) [0x00068] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\TemplatedCell.cs:117
at Xamarin.Forms.Platform.iOS.ItemsViewController`1[TItemsView].UpdateTemplatedCell (Xamarin.Forms.Platform.iOS.TemplatedCell cell, Foundation.NSIndexPath indexPath) [0x0007b] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewController.cs:262
at Xamarin.Forms.Platform.iOS.ItemsViewController`1[TItemsView].CreateMeasurementCell (Foundation.NSIndexPath indexPath) [0x0007b] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewController.cs:587
at Xamarin.Forms.Platform.iOS.ItemsViewController`1[TItemsView].GetPrototype () [0x0005d] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewController.cs:362
at Xamarin.Forms.Platform.iOS.ItemsViewLayout.DetermineCellSize () [0x00060] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewLayout.cs:211
at Xamarin.Forms.Platform.iOS.ListViewLayout.ConstrainTo (CoreGraphics.CGSize size) [0x0001e] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ListViewLayout.cs:16
at Xamarin.Forms.Platform.iOS.ItemsViewLayout.SetInitialConstraints (CoreGraphics.CGSize size) [0x00007] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewLayout.cs:111
at Xamarin.Forms.Platform.iOS.ItemsViewController`1[TItemsView].EnsureLayoutInitialized () [0x00044] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewController.cs:192
at Xamarin.Forms.Platform.iOS.ItemsViewController`1[TItemsView].ViewDidLoad () [0x00035] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewController.cs:148
at (wrapper managed-to-native) ObjCRuntime.Messaging.IntPtr_objc_msgSendSuper(intptr,intptr)
at UIKit.UIViewController.get_View () [0x0002a] in /Users/builder/azdo/_work/1/s/xamarin-macios/src/build/ios/native/UIKit/UIViewController.g.cs:3265
at Xamarin.Forms.Platform.iOS.ItemsViewRenderer`2[TItemsView,TViewController].SetUpNewElement (TItemsView newElement) [0x00022] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewRenderer.cs:102
at Xamarin.Forms.Platform.iOS.StructuredItemsViewRenderer`2[TItemsView,TViewController].SetUpNewElement (TItemsView newElement) [0x00000] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\StructuredItemsViewRenderer.cs:41
at Xamarin.Forms.Platform.iOS.SelectableItemsViewRenderer`2[TItemsView,TViewController].SetUpNewElement (TItemsView newElement) [0x00000] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\SelectableItemsViewRenderer.cs:34
at Xamarin.Forms.Platform.iOS.ItemsViewRenderer`2[TItemsView,TViewController].OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs`1[TElement] e) [0x0000c] in D:\a\s\Xamarin.Forms.Platform.iOS\CollectionView\ItemsViewRenderer.cs:36
at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].SetElement (TElement element) [0x00172] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementRenderer.cs:296
at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.iOS.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00000] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementRenderer.cs:158
at Xamarin.Forms.Platform.iOS.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x00032] in D:\a\s\Xamarin.Forms.Platform.iOS\Platform.cs:240
at Xamarin.Forms.Platform.iOS.VisualElementPackager.OnChildAdded (Xamarin.Forms.VisualElement view) [0x0003e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementPackager.cs:115
at Xamarin.Forms.Platform.iOS.VisualElementPackager.Load () [0x0001e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementPackager.cs:49
at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].SetElement (TElement element) [0x0012e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementRenderer.cs:283
at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.iOS.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00000] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementRenderer.cs:158
at Xamarin.Forms.Platform.iOS.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x00032] in D:\a\s\Xamarin.Forms.Platform.iOS\Platform.cs:240
at Xamarin.Forms.Platform.iOS.VisualElementPackager.OnChildAdded (Xamarin.Forms.VisualElement view) [0x0003e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementPackager.cs:115
at Xamarin.Forms.Platform.iOS.VisualElementPackager.Load () [0x0001e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementPackager.cs:49
at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].SetElement (TElement element) [0x0012e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementRenderer.cs:283
at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.iOS.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00000] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementRenderer.cs:158
at Xamarin.Forms.Platform.iOS.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x00032] in D:\a\s\Xamarin.Forms.Platform.iOS\Platform.cs:240
at Xamarin.Forms.Platform.iOS.VisualElementPackager.OnChildAdded (Xamarin.Forms.VisualElement view) [0x0003e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementPackager.cs:115
at Xamarin.Forms.Platform.iOS.VisualElementPackager.Load () [0x0001e] in D:\a\s\Xamarin.Forms.Platform.iOS\VisualElementPackager.cs:49
at Xamarin.Forms.Platform.iOS.PageRenderer.ViewDidLoad () [0x0008f] in D:\a\s\Xamarin.Forms.Platform.iOS\Renderers\PageRenderer.cs:251
at Rg.Plugins.Popup.IOS.Renderers.PopupPageRenderer.ViewDidLoad () [0x00000] in Z:\Documents\OpenSource\Rg.Plugins.Popup\Rg.Plugins.Popup\Platforms\Ios\Renderers\PopupPageRenderer.cs:74
at (wrapper managed-to-native) ObjCRuntime.Messaging.IntPtr_objc_msgSendSuper(intptr,intptr)
at UIKit.UIViewController.get_View () [0x0002a] in /Users/builder/azdo/_work/1/s/xamarin-macios/src/build/ios/native/UIKit/UIViewController.g.cs:3265
at Xamarin.Forms.Platform.iOS.PageRenderer.get_NativeView () [0x00000] in D:\a\s\Xamarin.Forms.Platform.iOS\Renderers\PageRenderer.cs:103
at Xamarin.Forms.Platform.iOS.PageRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x0003d] in D:\a\s\Xamarin.Forms.Platform.iOS\Renderers\PageRenderer.cs:119
at Xamarin.Forms.Platform.iOS.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x00032] in D:\a\s\Xamarin.Forms.Platform.iOS\Platform.cs:240
at Rg.Plugins.Popup.IOS.Extensions.PlatformExtension.GetOrCreateRenderer (Xamarin.Forms.VisualElement bindable) [0x0000a] in Z:\Documents\OpenSource\Rg.Plugins.Popup\Rg.Plugins.Popup\Platforms\Ios\Extensions\PlatformExtension.cs:21
at Rg.Plugins.Popup.IOS.Impl.PopupPlatformIos.AddAsync (Rg.Plugins.Popup.Pages.PopupPage page) [0x00052] in Z:\Documents\OpenSource\Rg.Plugins.Popup\Rg.Plugins.Popup\Platforms\Ios\Impl\PopupPlatformIos.cs:55
at Rg.Plugins.Popup.Services.PopupNavigationImpl.AddAsync (Rg.Plugins.Popup.Pages.PopupPage page) [0x00000] in Z:\Documents\OpenSource\Rg.Plugins.Popup\Rg.Plugins.Popup\Services\PopupNavigationImpl.cs:175
at Rg.Plugins.Popup.Services.PopupNavigationImpl+<>c__DisplayClass20_0.<PushAsync>b__0 () [0x00047] in Z:\Documents\OpenSource\Rg.Plugins.Popup\Rg.Plugins.Popup\Services\PopupNavigationImpl.cs:73
感谢@FabriBertani the link,它指出了异常的原因。 “使用 CollectionView 时,切勿将 DataTemplate 对象的根元素设置为 ViewCell。这将导致抛出异常,因为 CollectionView 没有单元格的概念。”将模板的外部视图设为 Grid 而不是不受支持的 Cell 可解决此问题。