【问题标题】:Xamarin custom control in a datatemplate created with CreateContent()使用 CreateContent() 创建的数据模板中的 Xamarin 自定义控件
【发布时间】:2021-07-23 14:20:04
【问题描述】:

我根据: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,它有一个小错误,它选择了错误的程序集。在这个问题中,我提到了一个现在可以使用的解决方法。

【问题讨论】:

  • 好 - 你有一个有效的案例,一个无效的案例。调试的最佳起点。显示所有适用的案例的相关代码。你说那是在不同的页面上——在那个页面上显示xmlns:controls(这样我们可以看到它是相同的),并显示使用IconButton的行(这样我们就可以看到那里是否有细微的不同) .另外,两个页面是否在同一个命名空间中?可以肯定的是,请在两页的顶部显示完整的声明&lt;...&gt;。跨越几行,包括Classxmlns
  • 1) 您是否确认templateToUse 是您期望的DataTemplate?我要采取的第一步是不使用Selector:硬编码对DataTemplate 的引用。也就是说,MyDataTemplate.CreateContent(); 是否给出同样的错误? 2) 寻找两个可能的原因:A) 工作页面上的不同xmlns:controls。确保没有第二个xmlns:controls,它指的是不同的命名空间。 B) 失败页面无法解析Universal_ONE.Views.Controls 命名空间。两个页面都在同一个项目中?
  • @ToolmakerSteve 嗨,史蒂夫,感谢您的帮助。我创建了一个最小的工作示例(请参阅编辑后的帖子)。这具有完全相同的错误,同时也非常简单。此示例还确保使用了正确的数据模板。
  • @jason - 你有时间看看问题中链接的 github 项目吗?
  • 我尝试下载你的例子并运行它,但是系统运行正常,没有错误,也无法访问catch方法。

标签: xamarin xamarin.forms


【解决方案1】:

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

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

【讨论】:

  • 这确实是“应该”发生的行为。确实应该显示“这应该始终有效”。但是,如果您查看 mainpage.xaml,您会看到添加了另一个带有文本的控件:“This never works”这在您的情况下也不起作用。您应该将断点放在第 42 行的 catch 语句内,以查看错误。
猜你喜欢
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
相关资源
最近更新 更多