Как сбросить значение IntegerUpDown до минимума, если оно превышает максимальное

Я имею IntegerUpDown как это

<xctk:IntegerUpDown Value ="{Binding SomeValue}", Maximum="2" Minimum="0"/>. 

Я был, если значение - SomeValue == 2 (Maximum), Я хочу установить SomeValue = 0 (Minimum) когда я нажимаю на стрелку вверх в элементе управления.

Как я могу это сделать?

3 ответа

Решение

Вы можете использовать событие "Изменено значение" для получения текущего значения. В событии "Значение изменено" проверьте значение, если оно равно Максимуму, установите для него значение "Минимум" следующим образом:

private void IntegerUpDown_ValueChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        var updown = (sender as IntegerUpDown);
        if (updown.Value == updown.Maximum)
            updown.Value = updown.Minimum;
    }

Если вы используете MVVM, то используйте поведение взаимодействия или команду, чтобы сделать то же самое.

или, может быть, вы привязали бы значение к свойству в ViewModel, как если бы вы могли привязать максимальное, минимальное значение к свойствам в ViewModel. Кроме того, вы можете проверить значение в событии измененного свойства свойства Value и установить значение On выше значения свойства Maximum value.

Если вы хотите сделать это на стороне View, для простого грязного решения вы можете попробовать обработать событие ValueChanged и проверить, достигнут ли минимум или максимум. Это, вероятно, не позволит вам изменить значение, когда вы достигнете своего максимума / минимума, поэтому вы, вероятно, хотите установить значения на <xctk:IntegerUpDown Value ="{Binding SomeValue}", Maximum="3" Minimum="-1"/>. и измените его соответственно на 0 или 2, если он достигнут.

Для лучшего и более чистого решения я не уверен, какие другие события возникают, когда вы пытаетесь изменить значение выше максимального / минимального. Но вы можете создать элемент управления на основе IntegerUpDown и переопределить int IncrementValue(int value, int increment) а также int DecrementValue(int value, int increment) методы.

Вы также можете удалить минимальные / максимальные ограничения в xaml:

<xctk:IntegerUpDown Value ="{Binding SomeValue}" />

А затем обработайте ограничение min/max и опрокидывание в вашей модели представления:

public double SomeValue
{
    get { return _SomeValue; }
    set
    {
        if (value < 0)
            _SomeValue = 0;
        else if (value >= 2)
            _SomeValue = 0;
        else
            _SomeValue = value;
        OnPropertyChanged("SomeValue");
    }
}
private double _SomeValue = 1;
Другие вопросы по тегам