web-dev-qa-db-fra.com

comment avoir 2 champs de liaison de données dans une étiquette de formulaire Xamarin?

Bonjour, j'ai une application sur laquelle je travaille en xamrie et qui reçoit les données d'un service. ce que j'essaie de faire est de faire en sorte que les champs prénom et nom s'affichent dans la même étiquette, mais le nom est affiché. Il renvoie ensuite une ligne et affiche le nom de famille. voici mon code xaml:

  <?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.Microsoft.com/winfx/2009/xaml"
             x:Class="ReadyMo.ContactInfo">
              <ListView ItemsSource="{Binding .}" HasUnevenRows="true">
               <ListView.ItemTemplate>
      <DataTemplate>
        <ViewCell>
          <Frame Padding="0,0,0,8" BackgroundColor="#d2d5d7">
            <Frame.Content>
              <Frame Padding="25,25,25,25"   OutlineColor="Gray" BackgroundColor="White">
                <Frame.Content>
                  <StackLayout Padding="20,0,0,0"  HorizontalOptions="CenterAndExpand" >
                    <Label x:Name="FirstName" Text="{Binding First_Name}">
                        </Label>
                        <Label x:Name ="LastName" Text="{Binding Last_Name}">
                        </Label>
                        <Label x:Name="County" Text="{Binding name}">
                        </Label>
                        <Label x:Name ="Adress" Text="{Binding Address1}">
                        </Label>
                          <Label x:Name ="City" Text="{Binding Address2}">
                        </Label>
                        <Label x:Name="Number"  Text="{Binding BusinessPhone}" >
                        </Label>   
                  </StackLayout>
                </Frame.Content>
              </Frame>
            </Frame.Content>
          </Frame>
        </ViewCell>
      </DataTemplate>
    </ListView.ItemTemplate>
  </ListView>
</ContentPage>

EDIT Voici mon codebehind:

using Newtonsoft.Json;
using ReadyMo.Data;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Net.Http;
using System.Threading.Tasks;

using Xamarin.Forms;

namespace ReadyMo
{

    public partial class ContactInfo : ContentPage
    {


        private County item;

        public static async Task<string> GetContactString(string contactid)
        {
            HttpClient client = new HttpClient();
            var url = $"URL";
            var response = await client.GetAsync(url);
            if (response.IsSuccessStatusCode)
            {
                var responsetext = await response.Content.ReadAsStringAsync();
                return responsetext;
            }
            throw new Exception(response.ReasonPhrase);
        }

        public ContactInfo()
        {
            InitializeComponent();
            ContactInfoList = new ObservableCollection<ContactInfoModel>();
        }

        ObservableCollection<ContactInfoModel> ContactInfoList;

        public ContactInfo(County item) : this()
        {
            this.item = item;
            this.BindingContext = ContactInfoList;
        }

        protected override async void OnAppearing()
        {
            if (item == null)
                return;
            var contact = await GetContactString(item.id);
            var models = JsonConvert.DeserializeObject<List<ContactInfoModel>>(contact);
            foreach (var model in models)
                ContactInfoList.Add(model);



        }

    }
}

toute aide serait incroyable! 

Merci d'avance :)

8
Phoneswapshop

Ce que je fais dans cette situation est de mettre une propriété supplémentaire sur le modèle qui combine les deux propriétés.

public class ContactInfo {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FirstLastName { get { return FirstName + " " + LastName; }}
    //Or use C# 6 goodness
    //public string FirstLastName => FirstName + " " + LastName;
}

Désormais, dans votre ViewModel, si le prénom ou le nom de famille change, vous devez procéder de la sorte pour mettre à jour la propriété FirstLastName:

private string _firstLastName;
public string FirstLastName {
    get { return _firstLastName; }
    set {
        if(_firstLastName != value) {
            _firstLastName = value;
            SetPropertyChanged();
        }
    }
}

private string _firstName;
public string FirstName {
    get { return _firstName; }
    set {
        if(_firstName != value) {
            _firstName = value;
            SetPropertyChanged();
            SetPropertyChanged("FirstLastName"); //Also send alert that FirstLastName changed
        }
    }
}

Ensuite, faites de même pour votre propriété LastName.

Edit: Votre XAML ressemblerait alors à:

<StackLayout Padding="20,0,0,0"  HorizontalOptions="CenterAndExpand" >
    <Label x:Name="FirstName" Text="{Binding FirstLastName}"/>
    .....
</StackLayout>

Edit2: Etant donné que vous ne modifiez probablement jamais la propriété Prénom ou Nom lors de l'affichage de l'interface utilisateur, il vous suffit d'ajouter la propriété à votre modèle, comme dans le code ContactInfo ci-dessus, puis de modifier votre libellé, comme dans l'exemple précédent dans l'édition ci-dessus et vous serez prêt à partir.

15
hvaughan3

On dirait que une étiquette peut contenir plusieurs étendues , à peu près analogue à TextBlock/Run dans WPF:

  <Label FontSize=20>
    <Label.FormattedText>
      <FormattedString>
        <Span Text="{Binding FirstName}" ForegroundColor="Red" FontAttributes="Bold" />
        <Span Text="{Binding MI}" />
        <Span Text="{Binding LastName}" FontAttributes="Italic" FontSize="Small" />
      </FormattedString>
    </Label.FormattedText>
  </Label>

MAUVAISE RÉPONSE

Il s'avère que Span.Text n'est pas reliable. Le XAML ci-dessus ne fonctionne pas; il jette des exceptions. Mais je vais laisser ça ici pour que personne d’autre ne gaspille du temps sur la même idée condamnée que je l’ai faite. 

Mettre à jour:

Afzal ALi commente que cela fonctionne dans XF 3.1 à compter d’août 2018.

10
Ed Plunkett

Comme Ed Phuket l'a dit, cela fonctionne mais:
Vous devez ajouter Mode=OneWay si vous voulez qu'il se mette à jour avec l'événement OnPropertyChanged dans l'étendue car il a OneTime Mode de liaison par défaut

0
Djeus