Дата окончания не может быть меньше даты начала (WPFToolkit DatePicker) - PullRequest
1 голос
/ 23 августа 2011

Я использую WPFToolkit для приложения MVFM WPF и пытаюсь настроить даты отключения для даты окончания на основе даты начала.

Пример 1:

 <toolkit:DatePicker SelectedDate="{Binding StartDate}"></toolkit:DatePicker>

Пример 2:

<toolkit:DatePicker SelectedDate="{Binding EndDate}">
     <toolkit:DatePicker.BlackoutDates>
          <toolkit:CalendarDateRange Start="1/1/2000" End="{Binding StartDate}" />
     </toolkit:DatePicker.BlackoutDates>
</toolkit:DatePicker>

Я получаю сообщение о том, что " End " не может иметь Binding

Как мне это сделать?

Ответы [ 2 ]

1 голос
/ 24 августа 2011

У меня была такая же задача, где два поля даты должны были координироваться друг с другом. У меня также была другая бизнес-логика, которая должна была быть реализована вместе с проверкой даты (например, когда и когда не проводить проверку).

Чтобы получить эту функциональность, я использовал правила проверки данных WPF.

 public class ValidateDate : ValidationRule
    {    
        public DateTime EndDate { get; set; }

        /// <summary>
        /// Validates date is valid
        /// </summary>
        /// <param name="value"></param>
        /// <param name="cultureInfo"></param>
        /// <returns></returns>
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            // Return if null
            if (value == null)
            {
                return new ValidationResult(true, null);
            }

            DateTime t;
            if (!DateTime.TryParse(value.ToString(), out t))
                return new ValidationResult(false, null);

            if(t == null)
            {
                return new ValidationResult(true, null);
            }

            if (t.Date < EndDate )
            {
                string message = "Invalid Date";  
                return new ValidationResult(false, message);
            }
            else
            {
                return new ValidationResult(true, null);
            }
        }

Вот привязки, применяемые в коде позади.

System.Windows.Data.Binding b1 = BindingOperations.GetBinding(dpMyDate,
                                                                         DatePicker.SelectedDateProperty);

b1.ValidationRules.Clear(); // Clear as I reuse them
ValidateDate vd = new ValidateDate();
vd.EndDate = datePickerEndDate.SelectedDate;
b1.ValidationRules.Add(vd);

Используя этот метод, вы можете запретить пользователям выбирать недопустимую дату и устанавливать стиль для ваших палитр, когда они недействительны, как показано ниже.

<Style TargetType="{x:Type DatePicker}">            
            <Setter Property="Width" Value="110"/>
            <Setter Property="Margin" Value="5"  />
            <Setter Property="HorizontalAlignment" Value="Left"/>
            <Setter Property="VerticalAlignment" Value="Center"/>
            <Setter Property="Text" Value="No Date" />
            <Style.Triggers>
                <Trigger Property="Validation.HasError" Value="true">
                    <Setter Property="BorderBrush" Value="Red"/>
                    <Setter Property="BorderThickness" Value="1" />
                    <Setter Property="Foreground" Value="Red" />
                    <Setter 
                        Property="ToolTip" 
                        Value="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.Errors)[0].ErrorContent}" />
                </Trigger>
            </Style.Triggers>
        </Style>
1 голос
/ 24 августа 2011

Я думаю, вам нужно будет создать свой собственный DatePicker, если вы хотите такое поведение, потому что похоже, что свойство End инструментария не является DependencyProperty, поэтому свойство End не может указывать на привязку

В прошлом у меня была похожая ситуация , когда я не хотел, чтобы StartDate появлялся после EndDate, и я просто использовал ошибки проверки, которые ставят красную рамку вокруг поля даты, если оно недействительно.

...