Невозможно привязать свойства объекта к пользовательскому элементу управления

#c# #data-binding #xamarin.forms

#c# #привязка данных #xamarin.forms

Вопрос:

У меня есть страница содержимого, которая привязана к модели представления.

В модели представления я создаю новый адрес и передаю ему некоторые данные

 Address = new Address
{
     UserId = Guid.NewGuid(),
     PrimaryAddress = true,
     Postcode = "G23 5HU",
     Street = "Smith Street",
     City = "Large City",
     PhoneNumber = "115151"
};
  

У меня также есть элемент управления AddressInfo на странице содержимого следующим образом

  <controls:AddressInfo Address="{Binding Address}"></controls:AddressInfo>
  

Вот элемент управления, который он сам

 public partial class AddressInfo : ContentView
{
    public static readonly BindableProperty AddressProperty =
        BindableProperty.Create(nameof(Address), typeof(Address), typeof(AddressInfo), null);

    public Address Address
    {
        get { return (Address)GetValue(AddressProperty); }
        set { SetValue(AddressProperty, value); }
    }

    public AddressInfo()
    {
        InitializeComponent();
        Street.SetBinding(Label.TextProperty, new Binding(nameof(Address.Street), source: this));
        City.SetBinding(Label.TextProperty, new Binding(nameof(Address), source: this));
        PhoneNumber.SetBinding(Label.TextProperty, new Binding(nameof(Address), source: this));
        PostCode.SetBinding(Label.TextProperty, new Binding(nameof(Address), source: this));
    }
  

Вот элемент управления XAML

 <ContentView xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="TyreKlicker.XF.Core.Controls.AddressInfo">
<ContentView.Content>

    <StackLayout>
        <Label
                x:Name="Street"
                Text="{Binding Address.Street}" />
        <Label
                x:Name="City"
                Text="{Binding Address.City}" />
        <Label  Text="Hardcoded Text" ></Label>
        <Label
                x:Name="PostCode"
                Text="{Binding Address.Postcode}" />
        <Label
                x:Name="PhoneNumber"
                Text="{Binding Address.PhoneNumber}" />

        <Label x:Name="CardHeader"
                   Text="{Binding Header}"
                   TextColor="{StaticResource PrimaryDark}"
                   FontSize="Large" Margin="10,0,0,0" />

        <Button Clicked="Button_OnClicked"></Button>
    </StackLayout>
</ContentView.Content>
  

Когда я запускаю его, я ожидаю увидеть свойства адреса, но вместо этого все пустые, кроме жестко закодированного текста

Изображение запущенного приложения

Я добавил кнопку к элементу управления, чтобы помочь в отладке, если я остановлю событие Button_OnClicked, я смогу увидеть свойства адреса, и он содержит правильные данные, но он просто не отображается в списке, что я делаю не так?

Свойства адреса

Комментарии:

1. во-первых, вы устанавливаете привязку как в XAML, так и в коде. Выберите один или другой. Во-вторых, в коде вы непоследовательно задаете путь привязки

Ответ №1:

Благодаря подсказкам от Jason я удалил следующие строки из конструктора AddressInfo, и это сработало

         //Street.SetBinding(Label.TextProperty, new Binding(nameof(Address.Street), source: this));
        //City.SetBinding(Label.TextProperty, new Binding(nameof(Address), source: this));
        //PhoneNumber.SetBinding(Label.TextProperty, new Binding(nameof(Address), source: this));
        //PostCode.SetBinding(Label.TextProperty, new Binding(nameof(Address), source: this));
  

Спасибо за помощь!