【问题标题】:Can't create content with DataTemplate in code behind with control defined in xaml无法使用 xaml 中定义的控件在代码中使用 DataTemplate 创建内容
【发布时间】:2019-06-01 22:38:03
【问题描述】:

我的 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 个标签?

【问题讨论】:

  • 您以错误的方式使用资源。你需要什么标签。然后它的文本创建一个字符串,并在您的控件中引用它。阅读此devblogs.microsoft.com/xamarin/…

标签: xamarin.forms datatemplate


【解决方案1】:

我怀疑所有控件都需要唯一的 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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多