Простой индикатор занятости для WPF с использованием шаблона MVVM

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

У меня есть несколько запросов linq, выполнение которых занимает некоторое время при выборе другой даты из средства выбора даты, и я хочу отобразить некоторый простой индикатор загрузки, чтобы пользователь не думал, что окно просто зависло.

Я пытался реализовать Xceed busyindicator, но это не так просто, как я надеялся. Я думаю, что мне может понадобиться использовать BackgroundWorker, но я не смог заставить его работать. Я просто хочу показать любой индикатор выполнения, пока мои свойства установлены в ViewModel.

XAML:

<wpfTool:BusyIndicator 
    IsBusy="{Binding IsBusy}" 
    BusyContent="Calculating... Please wait..." >
</wpfTool:BusyIndicator> 

ViewModel:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using My.Model;
using LiveCharts;
using LiveCharts.Wpf;
using System.Windows;
using Xceed.Wpf;

namespace My.ViewModel
{
    public class MyViewModel : INotifyPropertyChanged
    {
        public MyViewModel()
        {
            SetBusinessDays();
            SetHolidays();
            SetWorkingDays();     
        }

        private bool _isBusy;
        public bool IsBusy 
        {
            get { return _isBusy; }
            set
            {
                _isBusy = value;
                OnPropertyChanged("IsBusy");
            }
        }

        public DateTime mDate = DateTime.Now;
        public DateTime MDate
        {

            get { return mDate; }
            set
            {
                if (value == mDate)
                {
                    return;
                }

                else
                {
                    mDate = value;
                    OnPropertyChanged("MDate");

                    SetBusy(); *** I was hoping this would work ***

                    SetBusinessDays();
                    SetHolidays();
                    SetWorkingDays();
                    SetDaysCompleted();

                    SetNotBusy(); *** I was hoping this would work ***
                }

            }

        }


        private void SetBusinessDays()
        {
            BusinessDays = Enumerable.Range(1, DateTime.DaysInMonth(MDate.Year, MDate.Month))
                                 .Select(day => new DateTime(MDate.Year, MDate.Month, day))
                                 .Count(d => d.DayOfWeek != DayOfWeek.Sunday &&
                                             d.DayOfWeek != DayOfWeek.Saturday);
        }


        private void SetHolidays()
        {
            int.TryParse(MDate.ToString("MM"), out int month);
            HolidaysInMonth = db.Holidays.Where(a => (a.Date <= MDate) && (a.Date.Month) == month).Select(a => a.ID).Count();
        }

        private void SetWorkingDays()
        {
            int.TryParse(MDate.ToString("MM"), out int month);
            WorkingDays = (BusinessDays - HolidaysInMonth);
        }        


        private void SetBusy()
        {
            IsBusy = true;
        }

        private void SetNotBusy()
        {
            IsBusy = false;
        }

Я уже читал примеры, которые вы предоставили Петру. Они не помогают! Это не повторяющийся вопрос. Пожалуйста, позвольте пользователям предоставлять ответы, потому что они также думают, что это будет полезно для сообщества.

0 ответов

Другие вопросы по тегам