Привязка в Xamarin.Forms не работает после запроса веб-API - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь создать простое приложение, которое будет предоставлять функции для чтения / записи данных в базу данных через веб-API.У меня есть модель представления, которая привязана к представлению, но она не работает должным образом после запроса веб-API, даже если этот вызов был успешно выполнен.Я пытался проверить значение с отображением предупреждения, значение является правильным, но оно не представлено в части просмотра, а именно в одной метке.Вот мой код:

<?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="SOSEUApp.Pages.NotePage"
         Title="Dnevnik">
<ContentPage.ToolbarItems>
    <ToolbarItem Text="GET" Clicked="ToolbarItem_Clicked"></ToolbarItem>
</ContentPage.ToolbarItems>
<ContentPage.Content>
    <StackLayout Orientation="Vertical">
        <ActivityIndicator IsRunning="{Binding IsBusy}" IsVisible="{Binding IsBusy}"></ActivityIndicator>
        <StackLayout Orientation="Vertical">
            <Label Text="{Binding Date,StringFormat='Date: {0}'}"></Label>
        </StackLayout>
        <StackLayout>

        </StackLayout>
    </StackLayout>
</ContentPage.Content>

 [XamlCompilation(XamlCompilationOptions.Compile)]
public partial class NotePage : ContentPage
{
    NoteViewModel nvm = new NoteViewModel();
    public NotePage()
    {
        InitializeComponent();
        BindingContext = nvm;
    }

    private async void ToolbarItem_Clicked(object sender, EventArgs e)
    {
        nvm.IsBusy = true;
        nvm.Notes = await App.NotesWebApiService.GetAll(nvm.CurrentActiveNote.Route);
        nvm.GetLastNote();
        nvm.IsBusy = false;
        await DisplayAlert("Info", nvm.Date.ToString(), "Close");
    }
}

открытый класс NoteViewModel: BaseViewModel {

    IList<Note> notes = new List<Note>();
    public IList<Note> Notes
    {
        get { return notes; }
        set { SetProperty(ref notes, value); }
    }

    private Note currentActiveNote = new Note();
    public Note CurrentActiveNote { get { return currentActiveNote; } }

    public string Date { get { return currentActiveNote.Date.ToString("dd.MM.yyyy"); } }
    public string OrderedNumber
    {
        get { return currentActiveNote.OrderNumber.ToString(); }
        set
        {
            string v = currentActiveNote.OrderNumber.ToString();
            SetProperty(ref v, value);
            currentActiveNote.OrderNumber = Convert.ToInt16(v);
        }
    }


    public string Description
    {
        get { return currentActiveNote.Description; }
        set
        {
            string v = currentActiveNote.Description;
            SetProperty(ref v, value);
            currentActiveNote.Description = v;
        }
    }


    public void GetLastNote()
    {

        notes.OrderBy(a => a.Date);
        currentActiveNote = notes.Last();
    }

}

открытый класс BaseViewModel: DataModel, INotifyPropertyChanged {

    bool isBusy = false;
    public bool IsBusy
    {
        get { return isBusy; }
        set { SetProperty(ref isBusy, value); }
    }

    string title = string.Empty;
    public string Title
    {
        get { return title; }
        set { SetProperty(ref title, value); }
    }

    protected bool SetProperty<T>(ref T backingStore, T value,
        [CallerMemberName]string propertyName = "",
        Action onChanged = null)
    {
        if (EqualityComparer<T>.Default.Equals(backingStore, value))
            return false;

        backingStore = value;
        onChanged?.Invoke();
        OnPropertyChanged(propertyName);
        return true;
    }

    #region INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        var changed = PropertyChanged;
        if (changed == null)
            return;

        changed.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion
}

Заранее спасибо!

1 Ответ

0 голосов
/ 19 марта 2019

только что вызвал метод SetProperty и передал туда нужные значения. Работает

Сказал как Джейсон, вам нужно вызвать событие PropertyChanged при изменении даты. Вот официальный документ для справки.

Как правило, обычно пишется Set методами. Как следует:

 private string propertyname;

 public string PropertyName
    {
        set { SetProperty(ref propertyname, value); }
        get { return propertyname; }
    }

Или написать следующим образом:

 public string PropertyName
        {
            set
            {
                if (propertyname!= value)
                {
                    propertyname= value;
                    OnPropertyChanged("PropertyName");
                }
            }
            get
            {
                return propertyname;
            }
        }

bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
{
    if (Object.Equals(storage, value))
        return false;

    storage = value;
    OnPropertyChanged(propertyName);
    return true;
}

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

Когда данные модели изменяются, они будут вызываться автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...