Можно ли выполнить ICommand при загрузке страницы? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть Icommand в моей модели представления, как показано ниже:

 public ICommand SalaryCommand
        {
            get
            {
                return new Command(async () =>
                {
                        await _apiServices.FetchSalary(this);
                });
            }
        }

У меня есть эта команда привязать к кнопке, чтобы искать историю зарплат определенного пользователя, чтобы он выводил информация, которая работает отлично. Однако я также хочу выполнить ее при загрузке с самой последней информацией о зарплате (текущий месяц). это возможно с Icommand? если нет, то каким другим способом я могу реализовать эту функцию при загрузке. * примечание: все переменные существуют в той же модели представления, что и SalaryCommand, а не в классе FetchSalary ();

Я попытался сделать это на главной странице зарплаты, но это не сработало:

        public SalaryPage()
        {
            InitializeComponent();
            Fetching();
        }
        private async void Fetching()
        {
            ApiServices _apiServices = new ApiServices();
            SalaryViewModel svm = new SalaryViewModel();
            string year = DateTime.Now.Year.ToString();
            string month = DateTime.Now.Month.ToString();
            await _apiServices.FetchSalary(svm);
        }

и вот функция FetchSalary (), которая работала для кнопки

         public async Task FetchSalary(SalaryViewModel svm)
        {
            Debug.WriteLine("Welcome to the fetch salary method");
            var keyValues = new List<KeyValuePair<string, string>>
            {
                new KeyValuePair<string, string>("UserID",App._username),
                new KeyValuePair<string, string>("Year",svm.dSYear),
                new KeyValuePair<string, string>("Month",svm.dSMonth)
            };
            var request = new HttpRequestMessage(HttpMethod.Post, "somelink");

            request.Content = new FormUrlEncodedContent(keyValues);

            var client = new HttpClient();
            var response = await client.SendAsync(request);

            var content = await response.Content.ReadAsStringAsync();
            Debug.WriteLine(content);


            start = content.IndexOf("Sal_Trsp") + "Sal_Trsp".Length;
            end = content.IndexOf("Sal_NssfMedPay") - start;
            string transportation = content.Substring(start, end);
            svm.sTransportation = "Transportation: " + simplify(transportation);


            start = content.IndexOf("Sal_Date_Year") + "Sal_Date_Year".Length;
            end = content.IndexOf("Sal_Date_Month") - start;
            string yyear = content.Substring(start, end);
            svm.sYear = "Year: " + simplify(yyear);

            start = content.IndexOf("Sal_Date_Month") + "Sal_Date_Month".Length;
            end = content.IndexOf("}") - start;
            string mmonth = content.Substring(start, end);
            svm.sMonth = "Month: " + simplify(mmonth);

            start = content.IndexOf("Sal_NetPaid") + "Sal_NetPaid".Length;
            end = content.IndexOf("Sal_users_FK") - start;
            string retString = content.Substring(start, end);
            svm.sNetPay = "Net Paid: " + simplify(retString);
            Debug.WriteLine(svm.sNetPay);
        }

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Вы можете выполнить ту же самую команду после загрузки страницы, обработав событие Loaded:

public SalaryPage()
{
    InitializeComponent();
    Loaded += (s, e) =>
    {
        SalaryCommand.Execute(null);
    };
}
1 голос
/ 23 марта 2020

Внутри Fetching () вы создаете модель представления, но вы не передали ее этому. DataContext, поэтому при обновлении svm представлению все равно.

Просто извлеките вашу команду в метод и вызовите его в своем конструкторе.

public SalaryViewModel() {
       Task.Run(async () => await FetchingAsync());
}

public ICommand SalaryCommand
        {
            get
            {
                return new Command(async () => await FetchingAsync());
            }
        }
private async Task FetchingAsync() {
       _apiServices.FetchSalary(this);
}
...