Задать вопрос
Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (13)

Наибольший вклад в теги

Все теги (103)

Лучшие ответы пользователя

Все ответы (874)
  • WPF Datepicker, как реализовать запрет на выбор одной даты больше 7 раз?

    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)});
            }
        }
    Ответ написан

Лучшие вопросы пользователя

Все вопросы (3)