Я использую элемент управления 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);
}
}
}
}