如何在一个 Xamarin 表单标签中有 2 个数据绑定字段?
Posted
技术标签:
【中文标题】如何在一个 Xamarin 表单标签中有 2 个数据绑定字段?【英文标题】:how to have 2 data binding fields in one Xamarin forms label? 【发布时间】:2016-10-06 05:51:25 【问题描述】:我正在 xamarin 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>
编辑这是我的代码隐藏:
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);
任何帮助都会很棒!
【问题讨论】:
【参考方案1】:*更新:随着 Xamarin Forms 4.7 的发布,您现在可以使用 Multi-Bindings 而不是创建 getter 属性。使用名字和姓氏的例子,你会做这样的事情:
<StackLayout Padding="20,0,0,0" HorizontalOptions="CenterAndExpand" >
<Label x:Name="FirstName">
<Label.Text>
<MultiBinding StringFormat="0 1">
<Binding Path="FirstName" />
<Binding Path="LastName" />
</MultiBinding>
</Label.Text>
</Label>
.........
</StackLayout>
*Pre-Xamarin Forms 4.7 在这种情况下,我所做的就是在模型上添加一个额外的属性来结合这两个属性。
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
属性做同样的事情。
编辑:您的 XAML 将如下所示:
<StackLayout Padding="20,0,0,0" HorizontalOptions="CenterAndExpand" >
<Label x:Name="FirstName" Text="Binding FirstLastName"/>
.....
</StackLayout>
Edit2:因此,由于您在显示 UI 时可能从未更改过 First Name 或 Last Name 属性,因此您只需将该属性添加到您的模型中,就像我在上面的 ContactInfo
代码中显示的那样,然后更改您的标签,就像我在上面的编辑中显示的那样,你会很高兴的。
【讨论】:
这可能是 OP 的最佳选择。 感谢您的回复!有没有办法通过 xaml 做到这一点?请告诉我:) @Phoneswapshop 没问题。原始答案与 XAML 完全兼容,但我添加了一个示例,说明更改后 XAML 的外观。 我正在将您的代码实现到我的代码中,我已经通过问题中的编辑添加了我的代码,请您看一下并建议如何将您的 sn-p 放在那里提前谢谢! :) @Phoneswapshop 很抱歉。没有考虑过您在ListView
中做事这一事实,请参阅编辑 2,如果您仍有问题,请告诉我。【参考方案2】:
正如 Ed Phuket 所说,它正在工作,但是:
如果您希望它使用OnPropertyChanged
事件更新到跨度,则需要添加Mode=OneWay
,因为它默认具有OneTime
绑定模式
【讨论】:
【参考方案3】:虽然 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>
【讨论】:
以上是关于如何在一个 Xamarin 表单标签中有 2 个数据绑定字段?的主要内容,如果未能解决你的问题,请参考以下文章