Простой индикатор занятости для 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;
}
Я уже читал примеры, которые вы предоставили Петру. Они не помогают! Это не повторяющийся вопрос. Пожалуйста, позвольте пользователям предоставлять ответы, потому что они также думают, что это будет полезно для сообщества.