2014-01-29 1 views
1

У меня есть интервал в моей программе, сохраненный как TimeSpan. Я хочу привязать значение к слайдеру, чтобы легко настроить TimeSpan. Мой план был что-то вроде этого, но он не работает (он ничего не делает вообще):Привязать временную рамку к слайдеру

EDIT: Изменен код на основе ответов, но все-таки у меня есть та же самая проблема

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 

    ... 

TimeSpan measure_gap = TimeSpan.FromSeconds(1); //init 
public double Measure_gap 
{ 
    get 
    { 
     return measure_gap.TotalSeconds; 
    } 
    set 
    { 
     if (value != measure_gap.TotalSeconds) 
     { 
      measure_gap = TimeSpan.FromSeconds(value); 
      OnPropertyChanged("Measure_gap"); 
     } 
    } 
} 

public event PropertyChangedEventHandler PropertyChanged; 

public void OnPropertyChanged(string propertyName) 
{ 
    if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 

и вот мой привязки (я думаю, что проблема здесь)

<Slider HorizontalAlignment="Left" Height="25" Margin="38,202,0,0" 
VerticalAlignment="Top" Width="217" Minimum="1" Maximum="10" SmallChange="1" 
Value="{Binding ElementName=MainWindow, Path=Measure_gap, Mode=TwoWay}"/> 

Так что мой вопрос, что я делаю неправильно :-) спасибо редактировать: this..BindingContext = это

+4

В основном вы никогда не говорите пользовательскому интерфейсу, что ваша ценность изменилась. Google для 'INotifyPropertyChanged'. В этом случае я лично решил использовать «DependencyProperty». – deloreyk

ответ

2

Вот небольшой, полностью функционирующий пример для вас. Ползунок - это привязка данных TwoWay к свойству MeasureGap. TextBlock привязан к ползунку, чтобы вы могли видеть текущее значение при его перетаскивании.

XAML

<Window x:Class="SliderExample.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Height="120" Width="300"> 

    <Grid Margin="20"> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 

     <StackPanel Grid.Row="0" Orientation="Horizontal"> 
      <TextBlock> 
       <Run Text="Current value:" /> 
       <Run Text="{Binding ElementName=MySlider, Path=Value}" /> 
      </TextBlock> 
     </StackPanel> 

     <Slider x:Name="MySlider" Grid.Row="1" 
       Minimum="1" Maximum="10" SmallChange="0.5" 
       Value="{Binding MeasureGap, Mode=TwoWay}" /> 
    </Grid> 
</Window> 

CodeBehind

using System; 

namespace SliderExample 
{ 
    public partial class MainWindow 
    { 
     TimeSpan _measureGap = TimeSpan.FromSeconds(3); 

     public MainWindow() 
     { 
      InitializeComponent(); 
      DataContext = this; 
     } 

     public double MeasureGap 
     { 
      get { return _measureGap.TotalSeconds; } 
      set { _measureGap = TimeSpan.FromSeconds(value); } 
     } 
    } 
} 

ScreenCap

notfound

+0

именно то, что мне нужно, и очень простой, отличный ответ спасибо – Stefan

0

Вы можете привязать свое значение ползунка к модели, которая реализует INotifyPropertyChanged (что сказал Кевин в комментарии) или вместо этого обрабатывать событие ValueChanged и извлекать новое значение вручную.

+1

Свойство 'Slider.Value' связывает' TwoWay' по умолчанию. Это не его проблема. – deloreyk

+1

Это правда. Исправлен мой ответ. –

3

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

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 

    TimeSpan measure_gap = TimeSpan.FromSeconds(1); //init 
    public double Measure_gap 
    { 
     get 
     { 
      return measure_gap.TotalSeconds; 
     } 
     set 
     { 
      if (value != measure_gap.TotalSeconds) 
      { 
       measure_gap = TimeSpan.FromSeconds(value); 
       OnPropertyChanged("Measure_gap"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string propertyName) 
    { 
     if(PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

Добро пожаловать ... Надеюсь, эти вещи помогут вам в будущем ... хотя, если вы считаете, что этот ответ будет полезен ... отметьте его как ответ ... Спасибо .. – Sankarann

+0

, так как я не нашел ни одного (accpeted) решения, как привязать переменную к элементу wpf, кажется, это большая проблема, поэтому я думал, и я не могу дать вам приемлемый ответ, потому что моя проблема еще не решена, но вы получаете конечно, для продвижения меня в правильном направлении (надеюсь), я просто решил попробовать вещь с зависимостью, а не сдаваться :-) последняя попытка! – Stefan

0

Это своего рода трудно сказать, что происходит с обновленным кодом, но идти вперед и попробовать это и дайте мне знать, если он работает или нет:

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

В верхней части файла XAML MainWindow, вы должны быть определение своего Window идти вперед и добавьте следующую строку:

<Window x:Class="Something.MainWindow" 
     ... 
     ... 
     DataContext="{Binding ReletiveSource={ReletiveSource Self}}"> 

Затем удалить имя элемента из связывании в вашем слайдере:

<Slider HorizontalAlignment="Left" Height="25" Margin="38,202,0,0" 
     VerticalAlignment="Top" Width="217" Minimum="1" Maximum="10" SmallChange="1" 
     Value="{Binding Measure_gap, Mode=TwoWay}"/> 
Смежные вопросы