ОБНОВЛЕНИЕ - 25 ЯНВАРЯ 2020
У меня было время, чтобы еще раз проверить ваш код и выяснить, что вы помещали шаблон непосредственно в DataTemplate (что в ListView не является возможный). Вы уже сообщаете, что сами нашли это (Хорошая работа!).
Я оставляю здесь исправление, которое собирался использовать для Вас, указывая на несколько вещей:
XAML
<?xml version="1.0" encoding="utf-8"?>
<ContentPage
x:Name="myPage"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="Playground.MainPage">
<ListView
ItemsSource="{Binding ListaProfissionais, Source={x:Reference myPage}}"
x:Name="ListViewProfissionais" HorizontalOptions="FillAndExpand"
HasUnevenRows="True"
VerticalOptions="FillAndExpand"
VerticalScrollBarVisibility="Never"
HorizontalScrollBarVisibility="Never"
BackgroundColor="Transparent"
SeparatorColor="Transparent">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Frame HasShadow="True" CornerRadius="5" HeightRequest="215" Margin="8" Padding="4" BackgroundColor="White">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="15"></RowDefinition>
<RowDefinition Height="25"></RowDefinition>
<RowDefinition Height="105"></RowDefinition>
<RowDefinition Height="25"></RowDefinition>
<RowDefinition Height="25"></RowDefinition>
</Grid.RowDefinitions>
<Label Text="{Binding Categoria}" TextColor="#8e8e8e" FontSize="10" Grid.Column="0" Grid.Row="0" VerticalOptions="StartAndExpand" HorizontalOptions="StartAndExpand" Margin="2,0,0,0"></Label>
<Label Text="{Binding Titulo}" FontAttributes="Bold" TextColor="#337760" FontSize="14" Grid.Column="0" Grid.Row="1" VerticalOptions="StartAndExpand" HorizontalOptions="StartAndExpand" Margin="2,0,0,0"></Label>
<Frame Grid.Column="0" Grid.Row="2" BackgroundColor="Transparent" CornerRadius="4" Padding="0" Margin="0">
<Image Source="{Binding FotoPerfil}" HorizontalOptions="FillAndExpand" Aspect="AspectFill" VerticalOptions="FillAndExpand" />
</Frame>
<Label Text="{Binding Endereco}" TextColor="#8e8e8e" FontSize="10" Grid.Column="0" Grid.Row="3" VerticalOptions="EndAndExpand" HorizontalOptions="StartAndExpand"></Label>
<Label Text="" Grid.Column="0" Grid.Row="4" FontSize="10" HorizontalOptions="StartAndExpand" TextColor="#ff9000" Padding="0,6,0,0">
<Label.FontFamily>
<OnPlatform x:TypeArguments="x:String" Android="Font-Awesome-Free-Solid.otf#FontAwesome5Free-Solid" iOS="FontAwesome5Free-Solid" />
</Label.FontFamily>
</Label>
<Label Text="{Binding Distancia}" TextColor="#ff9000" FontSize="10" Grid.Column="0" Grid.Row="4" VerticalOptions="Center" HorizontalOptions="StartAndExpand" Margin="10,0,0,0"></Label>
</Grid>
</Frame>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage>
Код позади:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace Playground
{
// Learn more about making custom code visible in the Xamarin.Forms previewer
// by visiting https://aka.ms/xamarinforms-previewer
[DesignTimeVisible(false)]
public partial class MainPage : ContentPage
{
public class Profissionais
{
public string Id { get; set; }
public string Categoria { get; set; }
public string Titulo { get; set; }
public string FotoPerfil { get; set; }
public string Endereco { get; set; }
public string Distancia { get; set; }
public string Sexo { get; set; }
}
private ObservableCollection<Profissionais> _listaProfissionais;
public ObservableCollection<Profissionais> ListaProfissionais
{
get => _listaProfissionais;
set
{
_listaProfissionais = value;
OnPropertyChanged(nameof(ListaProfissionais));
}
}
public MainPage()
{
InitializeComponent();
ListaProfissionais = new ObservableCollection<Profissionais>();
}
private async Task Call()
{
// Simulating a call to the "API" and add a new element each 2 seconds
for (int i = 0; i < 10; i++)
{
ListaProfissionais.Add(new Profissionais { Titulo = $"Professional {i}" });
await Task.Delay(2000);
}
}
protected override void OnAppearing()
{
base.OnAppearing();
// Call the "API" when everything is ready
Task.Factory.StartNew(Call);
}
}
}
Здесь, как вы можете видеть, Class Professionais не требуется наследовать от INotifyPropertyChanged. Единственное свойство, которое нужно уведомить в Binding engine - это ваша коллекция. ContentPage уже имеет метод OnPropertyChanged, который вы можете использовать. После этого ваш ListView будет прослушивать не только изменение свойства, но и саму коллекцию каждый раз, когда вы добавляете новый элемент.
Надеюсь, это поможет!
OLD
Предполагается, что вы пытаетесь связать свойство ListaProfissionais
из кода:
Подход 1 (не очень хорошая практика):
Вы необходимо добавить ListaProfissionais
к свойству BindingContext
класса. Вы можете подойти к этому следующим образом:
... assuming you already called your API ...
ListaProfissionais = JsonConvert.DeserializeObject<ObservableCollection<Profissionais>>(resultado);
BindingContext = ListaProfissionais;
В вашем XAML вместо ItemsSource="{Binding ListaProfissionais}"
используйте ItemSource="{Binding BindingContext}"
Подход 2 (лучший подход):
Установите имя на своей странице XAML для класса (Name = "listPage"). В вашем ListView вы можете сделать что-то вроде этого:
ItemsSource="{Binding ListaProfissionais, Source='{x:Reference listPage}'}"
Примечание: я проверю это позже.
Добавьте интерфейс INotifyPropertyChanged в файл cs и внедрите его метод.
Измените ListaProfissionais на свойство, подобное этому:
private ObservableCollection<Profissionais> _listaProfissionais;
public ObservableCollection<Profissionais> ListaProfissionais
{
get => _listaProfissionais;
set
{
_listaProfissionais = value;
// This should be the method implemented by INotifyPropertyChanged.
OnPropertyChanged(nameof(ListaProfissionais);
}
}
Примечания: список не будет уведомлять ListView. если вы не уведомите механизм привязки, что свойство изменилось. При этом мы проверяем, что связывающий контекст ListView прослушивает изменения свойств из ListProfessionais.
Надеюсь, это поможет.