ThabetMicrosoft Ответов: 1

Как заставить промежутка времени определяется с включить/отключить кнопки WPF


I have a TimeSpan textbox, my objectif is to disable the button Save when the form of TIMESPAN is wrong (exp 90:00:00)..

I try a code, it is correct for just once time..if I set 20:10:00 ..The Save button is enabled (correct). After that however the TIMESPAN is wrong 55:00:00, the button is enabled ( and the saving in database is 00:00:00)



How I can fix it to be work always correct? Thanks,


Что я уже пробовал:

код XAML:
<TextBox Name="txtTime"  Margin="10,10,10,10" >
                <TextBox.Text >
                    <Binding Path="Time" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True" Mode="TwoWay" >
                        <Binding.ValidationRules>
                            <local:DateTimeValidationRule ValidationStep="RawProposedValue"/>
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>


The ViewModel :


public bool  VarTIME ;



  [Required(ErrorMessage = "Time is required")]
    public TimeSpan Time
    {
        get { return time; }
        set
        {
            time = value;
            intervalString = Time.ToString();
            TimeSpan reded;
            bool success = TimeSpan.TryParseExact(intervalString, "hh\\:mm\\:ss",
                           CultureInfo.InvariantCulture, out reded);

            if (success)
            {
                VarTIME = true;
            }
            OnPropertyChanged("Time");
        }
    }


    public SheduleTrainViewModel()
    {
        VarTIME = false;
        addTrain = new RelayCommand<string>(AddTrainFunction, canAddTrain);

        private bool canAddTrain(string obj)
         {     return VarTIME;     

         }
    }

1 Ответов

Рейтинг:
7

PureNsanity

В этом случае это выглядит так, как будто он терпит неудачу, потому что вы не устанавливаете VarTIME обратно в false при сбое. Это должно все исправить:

public TimeSpan Time
{
    get { return time; }
    set
    {
        time = value;
        intervalString = Time.ToString();
        TimeSpan reded;

        VarTIME = TimeSpan.TryParseExact(intervalString, "hh\\:mm\\:ss",
                  CultureInfo.InvariantCulture, out reded);

        OnPropertyChanged("Time");
    }
}


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

Кроме того, я думаю, что вы, возможно, пропустили, что TimeSpan-это структура, поэтому она всегда будет иметь значение, поэтому required здесь не будет работать. Кроме того, для целей ввода может быть допустимо значение по умолчанию 0.00:00:00.

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

Для того, чтобы просто убедиться, что он действителен, простой подход, который я бы использовал, - это временной интервал? конвертер и возвращает null, если формат не соответствует ожидаемому. Затем измените свою команду, чтобы взять временной интервал? и верните false, если null.

Для более элегантного решения я бы посмотрел на некоторые примеры для проверки здесь:

Проверка текстового поля WPF C# - переполнение стека[^]


ThabetMicrosoft

Большое спасибо ,