как иметь 2 поля привязки данных в одной метке Xamarin forms?
Привет у меня есть приложение, над которым я работаю в xamrian froms, которое получает данные от службы. я пытаюсь сделать так, чтобы поля имени и фамилии отображались в одной метке, однако в настоящее время отображается имя, затем возвращается строка, а затем отображается фамилия. вот мой код 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 вот мой 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);
}
}
}
любая помощь будет удивительным!
спасибо заранее :)
4 ответов
что я делаю в этой ситуации, чтобы поместить дополнительное свойство в модель, которая сочетает в себе два свойства.
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;
}
теперь в вашей ViewModel, если имя или фамилия изменится, вам нужно будет сделать что-то вроде этого, чтобы обновить 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
}
}
}
затем сделайте то же самое для вас LastName
собственность.
Edit: ваш XAML будет выглядеть так:
<StackLayout Padding="20,0,0,0" HorizontalOptions="CenterAndExpand" >
<Label x:Name="FirstName" Text="{Binding FirstLastName}"/>
.....
</StackLayout>
Edit2: так как вы, вероятно, никогда не меняете имя или фамилию свойство при отображении пользовательского интерфейса вам просто нужно добавить свойство в свою модель, как я показываю в ContactInfo
код выше, а затем измените свой ярлык, как я показываю в редактировании выше, и вам будет хорошо идти.
выглядит так:метка может содержать несколько диапазонов, примерно analagous для TextBlock / Run в 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>
НЕПРАВИЛЬНЫЙ ОТВЕТ
оказывается Span.Текст нельзя связать. Приведенный выше XAML не работает; он создает исключения. Но я оставлю это здесь, чтобы никто больше не тратил время на ту же обреченную идею, что и я.
обновление:
Afzal Ali комментирует, что это работает в XF 3.1 по состоянию на август 2018.
как сказал Эд Пхукет, это работает, но:
Вам нужно добавить Mode=OneWay
Если вы хотите обновить с OnPropertyChanged
событие для диапазона, потому что оно имеет OneTime
режим привязки по умолчанию
в то время как команда в Xamarin Forms все еще выясняет привязку с элементом Span, вы можете просто изменить форматирование меток, чтобы заставить это работать:
<StackLayout Orientation="Horizontal" Padding="0" Margin="0" Spacing="0">
<Label Text="{Binding First_Name}" Margin="0" />
<Label Text=" " Margin="0" />
<Label Text="{Binding Last_Name}" Margin="0" />
</StackLayout>