WPF Mahapps DateTimePicker Blackout Days - PullRequest
0 голосов
/ 12 июля 2020

Я использую элемент управления Mahapps DateTimePicker и шаблон MVVM для отображения календаря, в котором пользователь может выбрать дату и время на основе определенных c дат, доступных для команды (команда выбирается в поле со списком)

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

Я бы не возражал сделать это как свойство проверки

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

xaml

    UserControl x:Class="Redstone.Desktop.Services.AddStageView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:Redstone.Desktop.Services"
                 xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls" 
    <Grid>
<ComboBox IsTextSearchEnabled="True" ItemsSource="{Binding Teams}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedTeam}"/>
        <controls:DateTimePicker
                        Width="250"
                        />
    </Grid>
    </UserControl>

viewmodel

public class AddStageViewModel : BindableBase
{
    private IRepository<Team> _teamRepo;
    private List<DateTime> _blacklist;
    public List<DateTime> BlackList
    {
        get => _blacklist;
        set
        {
            _blacklist = value;
            NotifyPropertyChanged();
        }
    }
    public Team SelectedTeam
    {
        get => _selectedTeam;
        set
        {
            _selectedTeam = value;
            NotifyPropertyChanged();
            BlackListDates();
        }
    }
    private ObservableCollection<Team> _teams;
    public ObservableCollection<Team> Teams
    {
        get => _teams;
        set
        {
            _teams = value;
            NotifyPropertyChanged();
        }
    }
    private int _totalPrice;
    public int TotalPrice
    {
        get => _totalPrice;
        set
        {
            _totalPrice = value;
            NotifyPropertyChanged();
        }
    }
    public Action Done { get; set; } = delegate { };
    public AddStageViewModel(
        IRepository<Team> teamRepo,
    )
    {
        _teamRepo = teamRepo;
        LoadTeams();
    }



    public async void LoadTeams()
    {
        var teams = await _teamRepo.GetAll();
        Teams = new ObservableCollection<Team>(teams);
    }

    public void BlackListDates()
    {
        var exampleDate = new DateTime(2020, 07, 22);
        BlackList.Add(exampleDate);

    }

}

модель

public class Stage : ValidatableBase
{
    public int Id { get; set; }
    private string _name;
    [Required]
    public string Name
    {
        get => _name;
        set
        {
            _name = value;
            NotifyPropertyChanged();
        }
    }
    public DateTime Schedule { get; set; }

    public Stage()
    {
        Name = "";
        Schedule = DateTime.Now;
    }
}

проверяемая база

public class ValidatableBase : BindableBase, INotifyDataErrorInfo
    {
        private ConcurrentDictionary<string, List<string>> _errors = new ConcurrentDictionary<string, List<string>>();

        protected new virtual void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            base.NotifyPropertyChanged();
            Validate();
        }

        public void OnErrorsChanged(string propertyName)
        {
            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
        }

        public bool HasErrors
        {
            get => _errors.Any(kv => kv.Value != null && kv.Value.Count > 0);
        }

        public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

        public IEnumerable GetErrors(string propertyName)
        {
            List<string> errorsForName;
            _errors.TryGetValue(propertyName, out errorsForName);
            return errorsForName;
        }


        public void Validate()
        {
            {
                var validationContext = new ValidationContext(this, null, null);
                var validationResults = new List<ValidationResult>();
                Validator.TryValidateObject(this, validationContext, validationResults, true);

                foreach (var kv in _errors.ToList())
                {
                    if (validationResults.All(r => r.MemberNames.All(m => m != kv.Key)))
                    {
                        List<string> outLi;
                        _errors.TryRemove(kv.Key, out outLi);
                        OnErrorsChanged(kv.Key);
                    }
                }

                var q = from r in validationResults
                        from m in r.MemberNames
                        group r by m into g
                        select g;

                foreach (var prop in q)
                {
                    var messages = prop.Select(r => r.ErrorMessage).ToList();

                    if (_errors.ContainsKey(prop.Key))
                    {
                        List<string> outLi;
                        _errors.TryRemove(prop.Key, out outLi);
                    }
                    _errors.TryAdd(prop.Key, messages);
                    OnErrorsChanged(prop.Key);
                }
            }



        }
    }
...