显示List Xamarin.Forms上的数据

时间:2016-07-15 02:58:58

标签: c# xaml xamarin xamarin.forms

我想显示列表中的数据以及电子邮件。我需要副总裁,我希望分别打开他们的电子邮件链接,以打开外部电子邮件平台。但是,代码似乎无法正常工作,它只为副总裁打开一封电子邮件,而包含它的整个标签似乎对它做出了反应。

这是它的屏幕截图。

enter image description here

我的Xmal代码

<Label Text="Vice-President:" FontSize="18" FontAttributes="Bold" XAlign="Center" TextColor="Black"/>
                <StackLayout x:Name="vpDetails">

                </StackLayout>

我的C#代码

foreach (var item in leaderDetail)
        {
            Boolean IsPresident = item.IsPresident;

            if (IsPresident == true)
            {
                lbPresidentName.Text = item.Name;
                btnPresidentEmail.Text = item.Email;

                var tgrPresident = new TapGestureRecognizer();
                tgrPresident.Tapped += (s, e) => Device.OpenUri(new Uri("mailto:" + item.Email));
                btnPresidentEmail.GestureRecognizers.Add(tgrPresident);
            }
            else 
            {
                vpDetails.Children.Add(new Label { Text = item.Name ,FontSize=14, HorizontalOptions = LayoutOptions.Center});

                vpDetails.Children.Add(new Label { Text = item.Email, FontSize=14, HorizontalOptions = LayoutOptions.Center, x:name="lbvPresident1Email"});

                //lbvPresident1Name.Text = item.Name;
                //lbvPresident1Email.Text = item.Email;

                var tgrVPEmail = new TapGestureRecognizer();
                tgrVPEmail.Tapped += (s, e) => Device.OpenUri(new Uri("mailto:" + item.Email));
                lbvPresident1Email.GestureRecognizers.Add(tgrVPEmail);
            }

        }

2 个答案:

答案 0 :(得分:1)

这是因为对于多个副总裁而言,您只是将文本附加到一个标签上。这意味着您首先添加一个副总裁,并将他的Gesture识别器添加到他的电子邮件中,并为另一个添加文本并注册另一个手势识别器。然后,第一个识别出轻击手势。

基本上,在整个代码运行之后会发生的事情是标签lbvPresident1Name包含所有副名称和电子邮件,并且有多个GestureRecognizers(每个副预设一个)。

要解决此问题,您应该创建一个副总裁名单,并将每个副总裁添加为项目或添加容器,并为其中的每个副本创建标签。

要在Xamarin.Forms中创建ListView,请参阅文档 - https://developer.xamarin.com/samples/xamarin-forms/WorkingWithListview/

要创建一个可以从代码中动态添加项目的容器,StackLayout组件将是您方案中的最佳选择。您只需用StackLayout代替当前标签,然后在foreach循环中创建标签,并使用Children.Add方法将它们放入StackLayout。

答案 1 :(得分:0)

要解决此问题,您必须使用StackLayout作为容器。创建一个Label的var并添加到foreach循环中。

DetailedClub.xaml

<StackLayout x:Name="vpDetails"></StackLayout>

DetailedClub.xaml.cs

foreach (var item in leaderDetail)
{
    //Create a new label for the Email
    var VpEmail = new Label { Text = item.Email, FontSize = 14, HorizontalOptions = LayoutOptions.Center };

    vpDetails.Children.Add(new Label { Text = item.Name ,FontSize=14, HorizontalOptions = LayoutOptions.Center});

    vpDetails.Children.Add(VpEmail);

    var tgrVPEmail = new TapGestureRecognizer();
    tgrVPEmail.Tapped += (s, e) => Device.OpenUri(new Uri("mailto:" + item.Email));
    VpEmail.GestureRecognizers.Add(tgrVPEmail); 
}