Xamarin Forms MVVM Сбой привязки данных при привязке к одному объекту - PullRequest
0 голосов
/ 16 октября 2018

У меня проблема с данными, которые не связываются правильно на странице сведений, когда я щелкаю по ListView с помощью кнопки.ListView отлично связывается, и объект передается на страницу сведений.Идентификатор объекта читается, и из API вызывается полная версия объекта и устанавливается новый экземпляр объекта.Когда я добавляю точку останова, полный объект доступен, но метки в представлении не заполняются.Вот ViewModel:

DetailsViewModel.cs

public class DetailsViewModel
{
    public Deal Deal { get; set; }
    public int DealId { get; set; }

    public DetailsViewModel(int id)
    {
        Deal = new Deal();
        DealId = id;
    }

    public async void GetDeal()
    {
        var deal = await Deal.GetDeal(DealId);
        if(deal != null)
        {
            Deal = deal;
        }
    }
}

Код выглядит следующим образом:

DetailPage.Xaml.cs

DetailsViewModel viewModel;
    int dealId;

    public DetailPage(int id)
    {
        InitializeComponent();

        dealId = id;
        viewModel = new DetailsViewModel(dealId);
        BindingContext = viewModel;
    }

    protected override void OnAppearing()
    {
        base.OnAppearing();
        viewModel.GetDeal();
    }

Ифайл Xaml имеет вид

DetailPage.Xaml

 <ContentPage.Content>
    <ScrollView>
        <StackLayout x:Name="detailsLayout">

            <Label Text="{Binding Deal.Name}" />

        </StackLayout>
    </ScrollView>

</ContentPage.Content>

Когда я ставлю точку останова в Deal = deal на DetailsViewModel, объект Deal существует и имеет правильные данные, но я просто получаю пустоеэкран.Я пытался использовать Labels с Text = "{Binding Name}" и Text = "{Binding Deal.Name}".

Я также пытался вручную создать сделку в функции GetDeal ViewModel, но все еще ничего не происходит.оценка.

1 Ответ

0 голосов
/ 16 октября 2018

1) Убедитесь, что ваше свойство уведомляет пользовательский интерфейс об изменениях, реализующих интерфейс INotifyPropertyChanged.См. https://docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-basics/data-bindings-to-mvvm

2) Убедитесь, что набор выполняется в потоке пользовательского интерфейса с помощью Device.BeginInvokeOnMainThread.https://docs.microsoft.com/fr-fr/dotnet/api/xamarin.forms.device.begininvokeonmainthread?view=xamarin-forms

using System.ComponentModel;
using System.Runtime.CompilerServices;
using Xamarin.Forms;

namespace YourNamespace
{
    public class DetailsViewModel : INotifyPropertyChanged
    {
        private Deal _deal;

        public Deal Deal
        {
            get => _deal;
            set
            {
                if (_deal != value)
                {
                    _deal = value;
                    OnPropertyChanged();
                }
            }
        }
        public int DealId { get; set; }

        public DetailsViewModel(int id)
        {
            //!! useless assignation
            //Deal = new Deal();
            DealId = id;
        }



        public async void GetDeal()
        {
            var deal = await Deal.GetDeal(DealId);

            if (deal != null)
            {
                //Ensure we are on UI thread
                Device.BeginInvokeOnMainThread(() => Deal = deal);
            }
        }


        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

    }
}
...