如何在一个 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 个数据绑定字段?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Xamarin 表单中有两个标签栏吗?

Xamarin 表单 - 如何在 TabbedView (iOS) 上自定义 VoiceOver

如何在xamarin表单ios中隐藏标签栏导航标题

如何在 xamarin 表单中动态创建标签上的点击事件

标签 xamarin 表单内的图像

当条目字段不可见时,如何隐藏 Xamarin 表单中的错误标签?