wpf синхронизация значений двух полос прокрутки - PullRequest
0 голосов
/ 13 июня 2018

Первая полоса прокрутки представляет значение от минимального значения до второй полосы прокрутки, а вторая полоса прокрутки представляет значение от минимального до максимального значения.

Поэтому, когда я меняю максимальное или минимальное значение, моя вторая полоса прокрутки работает правильно (scailing).А также, когда я использую свою первую полосу прокрутки, моя вторая не масштабируется - как и должно быть.

Проблема возникает, когда я использую вторую полосу прокрутки и устанавливаю текущее значение ниже значения первой полосы прокрутки.,Возможно ли как-то изменить значение первой полосы прокрутки, когда значение моей второй полосы прокрутки становится меньше (максимальное значение первой полосы прокрутки).Каким-то образом синхронизируется максимальное значение первой полосы прокрутки и текущее значение второй, поэтому, когда я устанавливаю значение второй полосы прокрутки ниже максимального значения первого, оно также меняет максимальное значение первой полосы прокрутки.

<ScrollBar Name="FirstScrollBar" 
    Minimum="{Binding Path=startValue}" 
    Maximum="{Binding Path=yellowFinishTag, Mode=TwoWay}"
    Value="{Binding Path=redFinishTag, Mode=TwoWay}"/>

<ScrollBar Name="SecondScrollBar" 
    Minimum="{Binding Path=startValue,  Mode=TwoWay}"
    Maximum="{Binding Path=endValue,  Mode=TwoWay}"
    Value="{Binding Path=yellowFinishTag,  Mode=TwoWay}"/>

Модель:

    public class Scale
{
    public float startValue { get; set; }
    public float endValue { get; set; }

    public float redFinishTag { get; set; }

    public float yellowFinishTag { get; set; }

    //Marks
    public float markFromValue { get; set; }
    public float markToValue { get; set; }

    public Scale()
    {

    }

    public ScaleDTO(float startValue, float endValue, float redFinishTag, float yellowFinishTag)
    {
        this.startValue = startValue;
        this.endValue = endValue;

        this.redFinishTag = redFinishTag;
        this.yellowFinishTag = yellowFinishTag;
    }
}

ОБНОВЛЕНИЕ Я добавил MVVM-подход в свой проект, чтобы исправить это.Моя ScaleViewModel:

    public class ScaleViewModel : INotifyPropertyChanged
{
    Scale scale;

    public ScaleViewModel()
    {
        scale = new Scale(0,100,0,0);
    }

    public Scale Scale
    {
        get
        {
            return scale;
        }
        set
        {
            scale = value;
        }
    }

    public float StartValue
    {
        get { return scale.startValue; }
        set
        {
            if (scale.startValue != value)
            {
                scale.startValue = value;
                RaisePropertyChanged("StartValue");

            }
        }
    }

    public float EndValue
    {
        get { return scale.endValue; }
        set
        {
            if (scale.endValue != value)
            {
                scale.endValue = value;
                RaisePropertyChanged("EndValue");
            }
        }
    }

    public float RedFinishTag
    {
        get { return scale.redFinishTag; }
        set
        {
            if (scale.redFinishTag != value)
            {
                scale.redFinishTag = value;
                RaisePropertyChanged("RedFinishTag");
            }
        }
    }

    public float YellowFinishTag
    {
        get { return scale.yellowFinishTag; }
        set
        {
            if (scale.yellowFinishTag != value)
            {
                scale.yellowFinishTag = value;
                RaisePropertyChanged("YellowFinishTag");
            }
        }
    }

    public float MarkFromValue
    {
        get { return scale.markFromValue; }
        set
        {
            if (scale.markFromValue != value)
            {
                scale.markFromValue = value;
                RaisePropertyChanged("MarkFromValue");
            }
        }
    }

    public float MarkToValue
    {
        get { return scale.markToValue; }
        set
        {
            if (scale.markToValue != value)
            {
                scale.markToValue = value;
                RaisePropertyChanged("MarkToValue");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string propertyName)
    {
        // take a copy to prevent thread issues
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Также я изменил DataContext и значения привязки в моем XAML.scroll bars

Значение красной верхней границы выше, чем желтой.red top border scroll bar value incorect

Все отлично работает, когда я добавляю этот плохой код:

                if (Scale.YellowFinishTag < Scale.RedFinishTag)
            {
                Scale.RedFinishTag = Scale.YellowFinishTag;
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...