如何用代码创建一个DataTemplate ?
DataTemplate没有像WPF那样的VisualTree属性。
文档也没有帮助。
有一个IDataTemplateController,但是它不控制任何东西。;
在源代码中发现:有一个用于创建视图的函数的构造函数参数
/// <Docs>
/// <param name="loadTemplate">A custom content generator to be called </param>
/// <summary>Creates and initializes a new instance of the <see cref="T:Microsoft.Maui.Controls.DataTemplate" /> class.</summary>
/// <remarks>To be added.</remarks>
/// </Docs>
public DataTemplate(Func<object> loadTemplate);
new DataTemplate(() => {
var label = new Label();
label.SetBinding(Label.TextProperty, new Binding("."));
return label;
});
当前绑定中有一个bug,你必须指定".",修复被合并。
注意,您也可以使用XAML创建其中的一部分,并使用代码隐藏对其进行定制。我用它来设置类型安全的相对绑定,因为智能感知不支持它们。
- 创建一个ContentView为XAML,并给视图中的元素一个名字
<ContentView
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:vms="clr-namespace:MyProject.ViewModels"
x:Class="MyProject.Views.MyDataTemplate"
x:DataType="vms:MyItemViewModel">
<HorizontalStackLayout x:Name="_template" x:FieldModifier="Public">
<Label Text="{Binding Name}" />
</HorizontalStackLayout>
</ContentView>
- 自定义mydatatemplate . example .cs中的视图
public partial class MyDataTemplate: ContentView
{
public MyDataTemplate()
{
InitializeComponent();
TapGestureRecognizer tap = new();
tap.SetBinding(TapGestureRecognizer.CommandProperty, new Binding(
nameof(MyItemContainerViewModel.ShowItemCommand),
source: new RelativeBindingSource(RelativeBindingSourceMode.FindAncestorBindingContext, typeof(MyItemContainerViewModel))
));
tap.SetBinding(TapGestureRecognizer.CommandParameterProperty, new Binding(Binding.SelfPath));
_template.GestureRecognizers.Add(tap);
}
}
- 将接收数据模板的元素命名为MyItemContainerPage
<ContentPage
...
x:Class="MyProject.Views.MyItemContainerPage"/>
<CollectionView
x:Name="_items"
ItemsSource="{Binding Items}">
</CollectionView>
</ContentPage>
- 在myitemcontainerpage . example .cs中设置元素的ItemTemplate
public partial class MyItemContainerPage : ContentPage
{
public MyItemContainerPage :
{
InitializeComponent();
_items.ItemTemplate = new DataTemplate(() => new MyDataTemplate()._template);
}
}
注意,只在模板类的静态字段中创建一次模板可能是一个好主意,例如,public static DataTemplate Instance { get; } = new(() => new MyDataTemplate()._template);
和make _template private。你也可以用.Content
代替._template
。