C# зависимое свойство/приведение свойства

У меня есть следующий класс:

public class Numbers :INotifyPropertyChanged
{
    private double _Max;
    public double Max 
    {
        get
        {
            return this._Max;
        }
        set
        {
            if (value >= _Min)
            {
                this._Max = value;
                this.NotifyPropertyChanged("Max");
            }
        }
    }

    private double _Min;
    public double Min
    {
        get
        {
            return this._Min;
        }
        set
        {
            if (value <= Max)
            {
                this._Min = value;
                this.NotifyPropertyChanged("Min");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (this.PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(info));
    }        
}

Проблема: я не хочу позволять пользователю вводить максимальное значение меньше минимального значения и так далее. Но приведенный выше код не работает в первый раз, когда другой класс пытается установить минимальное/максимальное значение, когда минимальное/максимальное значение имеет значение по умолчанию, равное нулю. Поскольку по умолчанию минимальное и максимальное значения будут равны нулю, если минимальное значение установлено > 0, что логически правильно, но ограничение не позволяет этого делать. Я думаю, мне нужно решить эту проблему, используя зависимое свойство или принуждение. Может ли кто-нибудь сделать это?


person Suresh    schedule 06.10.2011    source источник
comment
Почему min и max имеют значение по умолчанию 0? почему не Double.MinDouble и Double.MaxDouble?   -  person Amittai Shapira    schedule 06.10.2011


Ответы (3)


Вы можете поддержать его с помощью Nullable, чтобы он стал таким:

public class Numbers : INotifyPropertyChanged
{
    private double? _Max;
    public double Max
    {
        get
        {
            return _Max ?? 0;
        }
        set
        {
            if (value >= _Min || !_Max.HasValue)
            {
                this._Max = value;
                this.NotifyPropertyChanged("Max");
            }
        }
    }

    private double? _Min;
    public double Min
    {
        get
        {
            return this._Min ?? 0;
        }
        set
        {
            if (value <= Max || !_Min.HasValue)
            {
                this._Min = value;
                this.NotifyPropertyChanged("Min");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (this.PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
}
person Simon Stender Boisen    schedule 06.10.2011
comment
Спасибо. Это то, что я ожидал. - person Suresh; 06.10.2011
comment
Я тестировал, но он не работает, как ожидалось. В конечном итоге это позволяет пользователю вводить максимальное значение меньше минимального значения. - person Suresh; 07.10.2011

Инициализируйте _Max значением Double.MaxValue, _Min значением Double.MinValue.

person mbeckish    schedule 06.10.2011

Я не знаю, правильно ли я вас понял, но у вас может быть private bool, указывающее, устанавливается ли значение в первый раз и, таким образом, отменяет проверку.

выйди с моей головы:

    private bool _FirstTimeSet = false;
    private double _Max;
    public double Max 
    {
        get
        {
            return this._Max;
        }
        set
        {
            if (value >= _Min || _FirstTimeSet == false)
            {
                this._FirstTimeSet = true;
                this._Max = value;
                this.NotifyPropertyChanged("Max");
            }
        }
    }
person BigBlackDog    schedule 06.10.2011