C # / WPF - Как включить только определенный набор дат (не диапазон) в объекте DatePicker - PullRequest
2 голосов
/ 10 июня 2019

У меня есть список дат, из которых пользователь хотел бы выбрать. Эти даты не расположены последовательно друг за другом и могут быть разбросаны по заданному периоду времени. Из-за разбросанности дат я не могу использовать свойства «DisplayDateStart» и «DisplayDateEnd» элемента управления «DatePicker» WPF. Есть ли способ, которым я могу сделать средство выбора даты серым цветом всех других дат, которые не находятся в данном списке. Ниже приведен фрагмент «псевдо» кода, демонстрирующий то, чего я хотел бы достичь.

public void foo(List<DateTime> ldtData, DatePicker dpPicker) 
{
        dpPicker.EnabledDates = ldtData; // What I would like to do in a perfect world (:
    }

1 Ответ

4 голосов
/ 10 июня 2019

Нет EnabledDates свойства. Существует свойство BlackoutDates , в которое можно добавлять даты, которые не выбираются.

Но если вы связываетесь со списком выбираемых дат, вы можете использовать CalendarDayButtonStyle и конвертер, чтобы определить, следует ли выбирать конкретную дату:

public class DateToBoolConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values == null || values.Length < 2)
            return true;

        IList<DateTime> selectableDates = values[0] as IList<DateTime>;
        if (selectableDates == null)
            return true;

        DateTime currentDate = (DateTime)values[1];
        return selectableDates.Contains(currentDate);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

XAML:

<DatePicker x:Name="dpPicker">
    <DatePicker.CalendarStyle>
        <Style TargetType="Calendar">
            <Setter Property="CalendarDayButtonStyle">
                <Setter.Value>
                    <Style TargetType="CalendarDayButton">
                        <Style.Resources>
                            <local:DateToBoolConverter x:Key="DateToBoolConverter" />
                        </Style.Resources>
                        <Setter Property="IsHitTestVisible" Value="False" />
                        <Setter Property="Opacity" Value="0.5" />
                        <Style.Triggers>
                            <DataTrigger Value="True">
                                <DataTrigger.Binding>
                                    <MultiBinding Converter="{StaticResource DateToBoolConverter}">
                                        <Binding Path="Tag" RelativeSource="{RelativeSource AncestorType=DatePicker}" />
                                        <Binding Path="." />
                                    </MultiBinding>
                                </DataTrigger.Binding>
                                <Setter Property="IsHitTestVisible" Value="True" />
                                <Setter Property="Opacity" Value="1" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Setter.Value>
            </Setter>
        </Style>
    </DatePicker.CalendarStyle>
</DatePicker>

Пример использования:

public void foo(List<DateTime> ldtData, DatePicker dpPicker)
{
    dpPicker.Tag = ldtData;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...