2013-08-08 6 views
1

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

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

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

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

My Window 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)); 
    } 

} 
+0

Если вы измените значение Min и Max в коде, изменится ли положение ползунка? –

ответ

2

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

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

MSDN разъясняет BindingMode s.