WPF Calendar: раскрасить даты в разные цвета в зависимости от наличия дат в коллекции
Всем привет. Задача состоит в том, чтобы пользователь мог выбирать дату в календаре и назначать ей определенный цвет. Потом эта инфа будет сохранятся в базе данных. В Control template календаря я добавил Rectangle, которые закрашивается, если находится дата в коллекции. Сейчас я на стадии, когда я могу раскрасить определённые даты, которые я определил в конструкторе конвертера. Однако, как заполнить эту коллекцию через viewmodel понять не могу. Посмотрите, пожалуйста, есть какие-нибудь идеи? Заранее спасибо.
Стиль календаря (Rectangle LossesMark):
<Style x:Key="CalendarDayButtonStyle" TargetType="CalendarDayButton">
<Setter Property="MinWidth" Value="5" />
<Setter Property="MinHeight" Value="5" />
<Setter Property="FontSize" Value="10" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Foreground" Value="Orange" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="CalendarDayButton">
<Grid>
<Rectangle
x:Name="TodayBackground"
Opacity="0"
RadiusX="1"
RadiusY="1">
<Rectangle.Fill>
<SolidColorBrush Color="Transparent" />
</Rectangle.Fill>
</Rectangle>
<Rectangle
x:Name="SelectedBackground"
Opacity="0"
RadiusX="1"
RadiusY="1">
<Rectangle.Fill>
<SolidColorBrush Color="Transparent" />
</Rectangle.Fill>
</Rectangle>
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}" />
<Rectangle
x:Name="HighlightBackground"
Opacity="0"
RadiusX="1"
RadiusY="1">
<Rectangle.Fill>
<SolidColorBrush Color="{DynamicResource ControlMouseOverColor}" />
</Rectangle.Fill>
</Rectangle>
<Rectangle
x:Name="LossesMarker"
Fill="{Binding Converter={converters:CalendarConverter}}"
Opacity="1"
RadiusX="1"
RadiusY="1">
</Rectangle>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Конвертер:
public class CalendarConverter : MarkupExtension, IValueConverter
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public ObservableCollection<CalendarPainterCollection> LossesList { get; set; }
public CalendarConverter()
{
LossesList = new ObservableCollection<CalendarPainterCollection>();
LossesList.Add(new CalendarPainterCollection() { Date = new DateTime(2020, 4, 1), Color = "Red" });
LossesList.Add(new CalendarPainterCollection() { Date = new DateTime(2020, 4, 15), Color = "Green" });
LossesList.Add(new CalendarPainterCollection() { Date = new DateTime(2020, 4, 28), Color = "Yellow" });
LossesList.Add(new CalendarPainterCollection() { Date = new DateTime(2020, 5, 2), Color = "Red" });
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string outPut = "Transparent";
if (value != null)
{
DateTime date = (DateTime)value;
var checkLosses = (from cl in LossesList
where cl.Date.Equals(date)
select cl).ToList();
if (checkLosses.Count() > 0) { return outPut = checkLosses.Select(s => s.Color).FirstOrDefault(); }
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}