it-swarm.com.de

wie kann man 2 Datenbindungsfelder in einem Xamarin-Formular-Label haben?

Hallo, ich habe eine App, an der ich arbeite, in Xamrian froms, die Daten von einem Dienst erhält. was ich versuche, ist, dass die Felder für den Vornamen und Nachnamen in derselben Beschriftung angezeigt werden. Derzeit wird jedoch der Vorname angezeigt. Dann wird eine Zeile ausgegeben und der Nachname angezeigt. heres mein xaml code:

  <?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>

BEARBEITEN Hier ist mein 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);



        }

    }
}

jede Hilfe wäre toll! 

Danke im Voraus :)

8
Phoneswapshop

In dieser Situation füge ich dem Modell eine zusätzliche Eigenschaft hinzu, die die beiden Eigenschaften kombiniert.

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;
}

Wenn sich nun in ViewModel der erste oder letzte Name ändert, müssen Sie Folgendes tun, um die FirstLastName-Eigenschaft zu aktualisieren:

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
        }
    }
}

Dann machen Sie dasselbe für Ihre LastName-Eigenschaft.

Edit: Deine XAML würde dann so aussehen:

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

Edit2: Da Sie die Eigenschaft First oder Last Name während der Anzeige der Benutzeroberfläche wahrscheinlich nicht ändern, müssen Sie die Eigenschaft nur Ihrem Modell hinzufügen, wie ich es im Code ContactInfo oben angezeigt habe, und dann Ihr Label ändern, wie ich es zeige in der Bearbeitung oben und du wirst gut gehen.

15
hvaughan3

Sieht aus wie Ein Label kann mehrere Bereiche enthalten , grob analog zu TextBlock/Run in 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>

FALSCHE ANTWORT

Es stellt sich heraus, dass Span.Text nicht bindbar ist. Das obige XAML funktioniert nicht. es wirft Ausnahmen. Aber ich lasse das hier, damit niemand anderes Zeit auf die gleiche verurteilte Vorstellung verschwendet wie ich. 

Aktualisieren:

Afzal ALi kommentiert, dass dies ab August 2018 in XF 3.1 funktioniert.

10
Ed Plunkett

Wie Ed Phuket sagte, funktioniert es aber:
Sie müssen Mode=OneWay hinzufügen, wenn Sie möchten, dass das Ereignis mit OnPropertyChanged auf den Bereich aktualisiert wird, da es OneTime-Bindemodus als Standardeinstellung hat

0
Djeus