Ползунок диапазона WPF не привязывается

Кажется, у меня такая же проблема с любой реализацией RangeSlider (или, проще говоря, ползунка с двумя большими пальцами).

Я хочу привязать оба больших пальца к контексту данных и сделать эту привязку двусторонней. К сожалению, мне кажется, что я могу привязываться только к SET положениям ползунков. Если я перемещаю их мышью, они теряют свою привязку.

Я использовал несколько ползунков диапазона, но для простоты в этом примере я использую один из thejoyofcode.com . (Я не модифицировал его, поэтому сейчас не включаю, но могу, если поможет). Я использую его, используя приведенный ниже XAML, чтобы ползунки фреймворка (с именами «MinSlider» и «MaxSlider») также были привязаны к одним и тем же источникам данных.

Когда я перемещаю ползунки структуры, все связанные элементы следуют за ними, включая ползунок диапазона, но затем, если я перемещаю один из ползунков на ползунке диапазона, он не обновляет источник данных или ползунок структуры .

Мой оконный XAML...

        <Separator></Separator>

        <controls:RangeSlider x:Name="Slider" 
                              Minimum="10"
                              Maximum="20"
                              LowerValue="{Binding Min, UpdateSourceTrigger=PropertyChanged}"
                              UpperValue="{Binding Max, UpdateSourceTrigger=PropertyChanged}"
                              />
        <TextBlock Text="{Binding LowerValue, ElementName=Slider}"/>
        <TextBlock Text="{Binding UpperValue, ElementName=Slider}"/>

        <Separator></Separator>

        <Slider x:Name="MaxSlider" Minimum="10" Maximum="20" Value="{Binding Max}"/>
        <TextBlock Text="{Binding Value, ElementName=MaxSlider}"/>

        <Separator></Separator>

        <TextBlock Text="{Binding Min}"/>
        <TextBlock Text="{Binding Max}"/>
    </StackPanel>
</Window>

...и класс MySource...

public class MySource : INotifyPropertyChanged
{
    private double _min;
    public double Min
    {
        get { return _min; }
        set
        {
            _min = value;
            RaisePropertyChanged("Min");
        }
    }

    private double _max;
    public double Max
    {
        get { return _max; }
        set
        {
            _max = value;
            RaisePropertyChanged("Max");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        var handler = this.PropertyChanged;
        if (handler != null)
        {
            handler(this, e);
        }
    }

    protected void RaisePropertyChanged(String propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }

}

person Mat Fergusson    schedule 08.08.2013    source источник
comment
Если вы измените Min и Max в коде программной части, изменится ли положение ползунка?   -  person Rob H    schedule 08.08.2013


Ответы (1)


Это потому, что вам нужно установить BindingMode=TwoWay в ваших Bindings.

Автор Control может сделать это поведением по умолчанию (WPF Slider делает это), но если свойство зависимости не зарегистрировано с FrameworkPropertyMetadata.BindsTwoWayByDefault, тогда будет использоваться OneWay режим.

MSDN объясняет BindingModes.

person Abe Heidebrecht    schedule 08.08.2013