xamarin - 使用 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,它有一个小错误,它选择了错误的程序集。在这个问题中,我提到了一个现在可以使用的解决方法。
解决方案
推荐阅读
- python - 在 imageai 中,您如何解释保存的模型的名称,例如“model_ex-077_acc-0.941176.h5”?
- swift - 如何在 swift 的 if 语句中使用常量?
- mongodb - 如何通过 terraform 明确的依赖关系来正确地获得部署顺序
- python - QGraphicsTextItem 没有更新分数
- c++ - 为什么使用模板结构作为基类而不是常规类/接口?
- makefile - 对于单平台项目,cmake 比 make 有什么好处
- google-codelab - Flutter 提供的链接点击时出现以下 404 错误
- reactjs - TypeError:无法读取未定义的属性“地图”,尝试从 mongodb 读取
- spring-boot - Logback 滚动策略不会删除比最大历史记录更早的文件
- powerbi - power bi:如何在矩阵中垂直旋转列名