uwp - XamlReader 无法使用 DataType 属性分析 DataTemplate
问题描述
我正在尝试使用 cpp/winrt 动态创建DataTemplate
一个:ListView
auto template_src = R"(
<DataTemplate
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MyNamespace"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:DataType="local:MyListItem"
>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Bind MyProperty}" HorizontalAlignment="Left"/>
</StackPanel>
</DataTemplate>
)";
auto tmpl = winrt::Windows::UI::Xaml::Markup::XamlReader::Load(winrt::to_hstring(template_src)).as<winrt::Windows::UI::Xaml::DataTemplate>();
Load 调用时抛出异常:
在类型“DataTemplate”中找不到属性“DataType”。[行:8 位置:17]
该类型MyListItem
是自定义的 winrt 类型。使用时需要该DataType
属性x:Bind
。如果我删除该属性并按如下方式替换绑定,它不会崩溃但也不会呈现:
auto template_src = R"(
<DataTemplate
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MyNamespace"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding MyProperty}" HorizontalAlignment="Left"/>
</StackPanel>
</DataTemplate>
)";
auto tmpl = winrt::Windows::UI::Xaml::Markup::XamlReader::Load(winrt::to_hstring(template_src)).as<winrt::Windows::UI::Xaml::DataTemplate>();
如果我在 Xaml 中声明模板:
<Page.Resources>
<DataTemplate x:Key="ListTemplate" x:DataType="local:MyListItem">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{x:Bind MyProperty, Mode=OneWay}" HorizontalAlignment="Left"/>
</StackPanel>
</DataTemplate>
</Page.Resources>
并加载它
Resources().Lookup(winrt::box_value(L"ListTemplate")).as<winrt::Windows::UI::Xaml::DataTemplate>());
列表正确呈现。
解决方案
在类型“DataTemplate”中找不到属性“DataType”。[行:8 位置:17]
根据文档,它提到我们无法在代码中创建 {x:Bind} 绑定,因此在关于 template_src 的代码中使用 {x:Bind} 会导致异常。您可以使用 {Binding} 替换 {x:Bind}。
如果我删除该属性并按如下方式替换绑定,它不会崩溃但也不会呈现:
如果在 C++/WinRT 中使用 {Binding} 扩展,则应将 BindableAttribute 属性添加到要使用 {Binding} 标记扩展的任何运行时类。有关此的更多详细信息,您可以参考此文档。在这种情况下,您需要在 .idl 文件中添加 [bindable] 才能使用 Binding。例如:
模型.idl:
[bindable]
runtimeclass BookSku : Windows.UI.Xaml.Data.INotifyPropertyChanged
{
String Title;
}
要呈现列表,请检查以下代码:
页面.cpp
auto template_src = R"(
<DataTemplate
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:MyNamespace"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Title}" HorizontalAlignment="Left"/>
</StackPanel>
</DataTemplate>
)";
hstring str = winrt::to_hstring(template_src);
auto tmpl = winrt::Windows::UI::Xaml::Markup::XamlReader::Load(str);
myListView().ItemsSource(MyListItem());
myListView().ItemTemplate(tmpl.try_as<DataTemplate>());
推荐阅读
- php - PHP使用浏览器的后退按钮破坏会话问题
- sql-server - 未知时间时在 SQL Server 中比较日期的最佳实践
- android - Are ConstraintLayout Animations In ScrollView Possible?
- hyperlink - How do I add an authorization header to the HTTP request initiated by clicking a link?
- regex - RegEx: Split into lines an remove characters
- regex - 一个或两个数字的正则表达式模式,不属于 4 数字组
- docker - Docker没有在主机上为Mac上的容器打开端口
- c++ - C++ 指针不包含预期值?
- c# - 在c#中将消息与服务器分开
- sql - 在雪花中将每月数据分解为每日数据