Привязка Xamarin Listview со свойствами объекта не работает - PullRequest
0 голосов
/ 05 августа 2020

Я использую:

  • VS 2019
  • Xamarin 16.1.0.545
  • Xamarin Forms 4.1.0

I есть проект Xamarin Android, который работал до и после обновления VS, привязки ListView перестали работать.

У меня есть страница содержимого с этим списком:

<ListView x:Name="ListViewServicos" SelectionMode="None" ItemTapped="ListViewServicos_ItemTapped">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell Height="80">
                <StackLayout Orientation="Vertical" Padding="10" Spacing="2" HeightRequest="80">
                    <StackLayout Orientation="Horizontal" VerticalOptions="StartAndExpand">
                        <Image Source="arrow" HorizontalOptions="Start"></Image>
                        <Label Text="{Binding Tipo}" TextColor="Black" HorizontalOptions="StartAndExpand"/>
                        <StackLayout Orientation="Horizontal" HorizontalOptions="EndAndExpand" WidthRequest="100">
                            <Label Text="{Binding MargemTotalFormatada}" TextColor="#555555" HorizontalOptions="EndAndExpand"/>
                        </StackLayout>
                    </StackLayout>
                    <StackLayout Orientation="Horizontal" VerticalOptions="StartAndExpand">
                        <StackLayout Orientation="Horizontal" HorizontalOptions="StartAndExpand">
                            <Label Text="Uso:" TextColor="#555555" HorizontalOptions="StartAndExpand"/>
                            <Label Text="{Binding MargemUtilizadaFormatada}" TextColor="#555555" HorizontalOptions="EndAndExpand"/>
                        </StackLayout>
                        <StackLayout Orientation="Horizontal" HorizontalOptions="EndAndExpand">
                            <Label Text="Disponível:" TextColor="#555555" HorizontalOptions="StartAndExpand" FontAttributes="Bold"/>
                            <Label Text="{Binding MargemFormatada}" TextColor="#555555" HorizontalOptions="EndAndExpand" FontAttributes="Bold"/>
                        </StackLayout>
                    </StackLayout>
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Я установил ItemsSource в такие .cs (в методе LoadServicesList, вызываемом внутри OnAppearing):

protected override void OnAppearing()
{
    base.OnAppearing();
    BindingContext = this;
    ConfigureScreen();
    LoadServicesList();
    servico = User.Servicos.First();
    LoadService(servico);
}

public void LoadServicesList()
{
    ListViewServicos.RowHeight = 80;
    ListViewServicos.HeightRequest = User.Servicos.Count() * 80;
    ListViewServicos.ItemsSource = User.Servicos;
}

User is stati c, а 'Servicos' - это список 'Servico':

public static class User
    {
        public static List<Servico> Servicos { get; set; }

А вот класс 'Servico':

public class Servico
{
    public string Tipo { get; set; }
    public double Margem { get; set; }

    public string MargemFormatada { get; set; }
        
    public double MargemUtilizada { get; set; }

    public string MargemUtilizadaFormatada { get; set; }

    public string MargemTotalFormatada { get; set; }

    public string Color { get; set; }

    public List<Margem> Margens { get; set; }

    public Servico(string tipo, double margem, double margemUtilizada)
    {
        this.Tipo = tipo;
        Margem = margem;
        MargemUtilizada = margemUtilizada;
        MargemFormatada = string.Format(new CultureInfo("pt-BR"), "{0:C}", margem);
        MargemUtilizadaFormatada = string.Format(new CultureInfo("pt-BR"), "{0:C}", margemUtilizada);
        MargemTotalFormatada = string.Format(new CultureInfo("pt-BR"), "{0:C}", margem + margemUtilizada);
    }
}

Самая странная часть всего этого заключается в том, что отображается только свойство «Tipo», другие привязки просто не отображаются (да, я ' проверил, и у них есть значения).

Я долго искал решение, но пока у меня ничего не работало. Я очень признателен, если кто-нибудь может мне помочь. Спасибо!

Ps: Я уже пробовал добавить "BindingContext = this;" после InitializeComponent (), но ничего не изменилось.

UPDATE:

Я только что обнаружил, что работает только свойство «Tipo» Servico, потому что в другой части кода я звонил User.Servicos.First (). Tipo. Похоже, что он будет отображаться в привязке списка только в том случае, если свойство get было вызвано ранее. Это супер странно.

Таким образом, обходной путь - l oop через User.Servicos и вызов всех свойств, которые я буду использовать в Listview:

string x = servico.MargemTotalFormatada;
string y = servico.MargemUtilizadaFormatada;
string w = servico.MargemFormatada;

С этим кодом привязки ListView работают. Это супер безобразно и неправильно, но я заставил это работать.

1 Ответ

0 голосов
/ 06 августа 2020

1. замените List<Servico> Servicos на ObservableCollection<Servico> Servicos:

public static class User
{
    public static ObservableCollection<Servico> Servicos { get; set; }
}

2. вызовите LoadServicesList другими способами.

    protected override void OnAppearing()
    {
        base.OnAppearing();
        BindingContext = this;
        ConfigureScreen();
        servico = User.Servicos.First();
        LoadService(servico);

        LoadServicesList();

    }

Обратитесь: listview / data-and-databinding

Обновление:

Пример проекта здесь: data-binding-of-Listview

...