@Blacklce

WPF Datepicker, как реализовать запрет на выбор одной даты больше 7 раз?

Здравствуйте.
Столкнулся с задачей реализации выбора даты в нескольких строках datagrid но с запретом выбора одной и той же даты больше 7 раз, т.е. надо написать код, который при изменении даты в любой ячейке проверял даты и если дата выбрана 7 раз, то выставлял ограничение в остальные пикеры. Как я понял, это можно ограничение можно реализовать через свойство "blackoutdates" но вот как реализовать...

Возможно кто то сталкивался с подобной задачей, расскажите пожалуйста как сделать, не так давно изучаю wpf поэтому туплю
  • Вопрос задан
  • 279 просмотров
Пригласить эксперта
Ответы на вопрос 1
twobomb
@twobomb
Ну вы бы хоть код какой-нибудь приложили, ну можно например так.

XAML
<DataGrid ItemsSource="{Binding GridItems}" AutoGenerateColumns="False" >
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Name}"></DataGridTextColumn>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <DatePicker SelectedDate="{Binding Date, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ></DatePicker>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
             </DataGrid.Columns>
        </DataGrid>

Сам класс элементов грида
public class MyItem{
        public string Name { get; set; } = "myname";

        public Func<DateTime?, bool> DateChecker = null;
        public DateTime? _Date;
        public DateTime? Date        {
            get => _Date;
            set {
                if (DateChecker != null && DateChecker.Invoke(value)){//При попытке установить дату вызваем метод который проверить сколько в коллекции у нас  уже таких дат
                    _Date = value;//Устанавливает дату если метод DateChecker вернул true
                }
            }
        }
    }

Ну и типа тут должна быть модель допустим, ну для примера сделаем всё в классе окна
public partial class MainWindow : Window
    {
        public ObservableCollection<MyItem> GridItems { get; set; }= new ObservableCollection<MyItem>(){};//Коллекция элементов

        public bool DateCheckerMethod(DateTime? dt){//Метод который будет вызываться при попытке изменить дату
            if (dt != null && GridItems.Count(item => item.Date != null && item.Date.Value.CompareTo(dt.Value) == 0) >= 7){
                MessageBox.Show("Максимум 7 дат");
                return false;
            }
            return true;
        }
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
            GridItems.CollectionChanged += (sender, args) => {//При добавлении в колелекцию нового элемента, присваиваем метод обработки  дат
                foreach (var myItem in args.NewItems.Cast<MyItem>())
                    myItem.DateChecker = DateCheckerMethod;
            };
            GridItems.Add(new MyItem() { _Date = DateTime.Now.Date});   
            GridItems.Add(new MyItem() { _Date = DateTime.Now.Date});   
            GridItems.Add(new MyItem() { _Date = DateTime.Now.Date});   
            GridItems.Add(new MyItem() { _Date = DateTime.Now.Date});   
            GridItems.Add(new MyItem() { _Date = DateTime.Now.Date});   
            GridItems.Add(new MyItem() { _Date = DateTime.Now.Date});   
            GridItems.Add(new MyItem() { _Date = DateTime.Now.Date});
            GridItems.Add(new MyItem() { _Date = DateTime.Now.Date.AddDays(1)});
        }
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы