无法使用xaml中定义的控件在代码中使用DataTemplate创建内容

时间:2019-06-01 09:31:52

标签: xamarin.forms datatemplate

我在ContentPage的xaml中的ResourceDictionary中具有以下标签:

<ContentPage.Resources>
       <ResourceDictionary>
            <Label Text="I am label" x:Name="label" x:Key="label"/>
       </ResourceDictionary>
</ContentPaget.Resources>

在我后面的代码中,我单击了以下事件处理程序:

void Handle_Clicked(object sender, System.EventArgs e)
    {
        DataTemplate dataTemplate = new DataTemplate(() => label);
        for (int i = 0; i < 3; i ++)
        {
            Label content = (Label) dataTemplate.CreateContent();
            stack.Children.Add(content);
        }
    }

在我称为Stack的StackLayout中-按下分配给Handle_Clicked的按钮时,仅添加1个标签。为什么只添加1个标签-应该添加3个标签?

1 个答案:

答案 0 :(得分:0)

我怀疑所有控件都需要唯一的ID。由于这也不起作用:

void Handle_Clicked(object sender, System.EventArgs e)
{
    for (int i = 0; i < 3; i ++)
    {
        stack.Children.Add(label);
    }
}

这使我首先尝试使用DataTemplate。意味着同一对象只能添加到视图一次。

还应注意createContent()有用-但仅当它在xaml中定义(不在后面的代码中实例化)时:

<ContentPage.Resources>
       <ResourceDictionary>
            <DataTemplate x:Name="dataTemplate" x:Key="dataTemplate">
                <Label Text="I am label"/>
            </DataTemplate>
       </ResourceDictionary>
</ContentPaget.Resources>

我发现的解决方法是在添加对象之前先摆脱DataTemplate和clone对象:

void Handle_Clicked(object sender, System.EventArgs e)
{
    for (int i = 0; i < 3; i ++)
    {
        var l = FastDeepCloner.DeepCloner.Clone(label);
        stack.Children.Add(l);
    }
}