Изменить значение привязки данных в формах ViewModel xamarin android - PullRequest
0 голосов
/ 05 марта 2020

У меня установлена ​​привязка:

using System;
using System.Collections.Generic;
using System.Text;
using LoanApp2.Model;
using System.Windows.Input;
using System.Threading.Tasks;
using System.ComponentModel;
using LoanApp2.Views;
using Newtonsoft.Json;
using System.Net.Http;

namespace LoanApp2.ViewModel
{
    public class LoginViewModel : INotifyPropertyChanged
    {
        // For data binding of activity indicator
        string actIndVal = "False";
        public string ActIndVal {
            get => actIndVal;
            set {
                if(actIndVal == value)
                {
                    return;
                } else
                {
                    actIndVal = value;
                    OnPropertyChanged(nameof(ActIndVal));
                }
            }
        }

        public static List<LoginBasicData> listLoginBasicData = new List<LoginBasicData>();

        public LoginViewModel()
        {
        }

        public event PropertyChangedEventHandler PropertyChanged;

        void OnPropertyChanged(string value)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(value));
        }
        public static async void VerifyClientID(string clientID)
        {
            // Start of HTTP Requests
            using (HttpClient client = new HttpClient())
            {
                ...
            }
        }
    }

Значением по умолчанию будет false, в классе VerifyClientID() я хочу вызвать ActIndVal и изменить его на true, чтобы Индикатор активности будет виден. И снова вызовите его в нижней части класса VerifyClientID(), чтобы я мог снова изменить значение на false.

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Изменение свойства в ViewModel не будет работать, вы должны изменить значение ActIndVal ViewModel, которое является вашим BindContext.

Например:

public partial class MainPage : ContentPage
{
    LoginViewModel myViewModel;
    public MainPage()
    {
        InitializeComponent();

        myViewModel = new LoginViewModel();
        this.BindingContext = myViewModel;
    }

    private async void Button_Clicked(object sender, EventArgs e)
    {
        myViewModel.ActIndVal = true;
        await myViewModel.VerifyClientID("clientID");
        myViewModel.ActIndVal = false;
    }
}

public class LoginViewModel : INotifyPropertyChanged
{
    // For data binding of activity indicator
    bool actIndVal = false;
    public bool ActIndVal
    {
        get => actIndVal;
        set
        {
            if (actIndVal == value)
            {
                return;
            }
            else
            {
                actIndVal = value;
                OnPropertyChanged(nameof(ActIndVal));
            }
        }
    }

    public LoginViewModel()
    {
    }

    public event PropertyChangedEventHandler PropertyChanged;

    void OnPropertyChanged(string value)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(value));
    }
    public async Task VerifyClientID(string clientID)
    {
        // Start of HTTP Requests
        await Task.Delay(3000);
    }
}

myViewModel.ActIndVal - это значение, которое необходимо изменить, поскольку Frame.IsVisible привязывается к этому значению. Изменение значения ActIndVal в вашей viewModel не имеет смысла.

Я загрузил свой пример проекта здесь и не стесняйтесь задавать мне любые вопросы.

0 голосов
/ 05 марта 2020

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

private bool actIndVal;
    public bool ActIndVal {
        get => actIndVal;
        set {
            if(actIndVal == value)
            {
                return;
            } else
            {
                actIndVal = value;
                OnPropertyChanged(nameof(ActIndVal));
            }
        }
    }

Затем в вашем методе измените значения:

        public async Task VerifyClientID(string clientID)
        {
            ActIndVal= true;
            //API CALL CODE
            ActIndVal= false;
        }

Затем просто свяжите это с вашим индикатором

<ActivityIndicator IsRunning="{Binding ActIndVal}" IsVisible="{Binding ActIndVal}" ....
...