首页 > 解决方案 > 使用 CreateContent() 创建的数据模板中的 Xamarin 自定义控件

问题描述

我根据:GitHub Xamarin Forms实现了一个自定义 DataTemplateSelector 。这允许基于通过数据绑定接收的项目来选择数据模板。这可以很好地选择适当的数据模板并呈现它。但是,我现在想向此数据模板(自定义按钮)添加自定义控件。这适用于任何其他页面,但由于某种原因不在此数据模板中。

数据模板中的相关行:

xmlns:controls="clr-namespace:Universal_ONE.Views.Controls"


<controls:IconButton Command="{Binding RobotLocationSave}"
                     Image="{StaticResource BoltBlack}"/>

选择和创建数据模板的部分:

var templateToUse = templateSelector.SelectTemplate(item, null);
View view = (View)templateToUse.CreateContent();
view.BindingContext = bindingContext;

在 catch 块中我得到错误(在调用 CreateContent() 之后):

Xamarin.Forms.Xaml.XamlParseException: Position 371:26. Type controls:IconButton not found in xmlns clr-namespace:Universal_ONE.Views.Controls

问题必须出在 CreateContent() 上,因为使用此数据模板之外的控件是有效的。

编辑 1 我创建了一个最小的工作示例:GitHub。数据模板现在是硬编码的,所以我确定选择了一个。抛出相同的解析异常。

我正在尝试自己编译 Xamarin.Forms,以便可以调试框架本身。但是,编译并不顺利;因此可能需要更长的时间。

编辑 2 关于 MWE 的更多信息: MainPage.xaml 具有默认的 Xamarin.Forms 应用程序代码。下面我添加了一个自定义控件,它只是一个带有标签的框架。此标签的文本是通过可绑定属性设置的(不是真正相关的)。在这个控件下面是添加的datatemplatecontrol,它又调用datatemplateselector,返回datatemplate。此数据模板包含与主页相同的控件。因此,渲染的应用程序应该有 2 个控件。但是,在 de datatemplatecontrol 中,您可以在 catch 语句上设置断点(查找我的评论)。这是 parseexception 将显示的地方,这是在对数据模板调用 CreateContent() 后引起的。

编辑 3 我认为我还不够清楚。但是你必须在 datatemplatecontroler.cs 的第 41 行下一个断点。由于如果 createcontent() 失败,数据模板的内容将设置为 null,因此正常失败。遇到断点时,您可以读取 parseexception。

编辑 4 我在 Xamarin 存储库:GitHub上提出了问题和拉取请求。问题在于 XamlParser,它有一个小错误,它选择了错误的程序集。在这个问题中,我提到了一个现在可以使用的解决方法。

标签: xamarinxamarin.forms

解决方案


我尝试下载您的示例并运行它。当我跑到 Content = CreateTemplateForItem(ItemTemplate); 程序没有报错,所以程序跳过了catch方法。这是运行时的屏幕截图:

在此处输入图像描述 在此处输入图像描述

然后我尝试在try语句中主动抛出异常(throw new Exception();)使程序进入catch方法,下面是运行时的截图: 在此处输入图像描述


推荐阅读