2014-01-29 136 views
1

我的程序中有一個間隔,保存爲TimeSpan。我想將這個值綁定到一個滑塊來輕鬆調整TimeSpan。我的計劃是這樣的,但它不工作(它什麼都沒有):將時間跨度綁定到滑塊

編輯:改變基礎上,回答了一些代碼,但我仍然有同樣的問題

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

你基本上從不告訴UI你的價值已經改變。 Google for'INotifyPropertyChanged'。在這種情況下,我會親自選擇使用「DependencyProperty」。 – deloreyk

回答

2

這裏是一個小而全功能的例子。滑塊是雙向數據綁定到MeasureGap屬性。 TextBlock綁定到Slider,因此您可以在拖動它時看到當前值。

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> 

代碼隱藏

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

擷取畫面

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元素,它似乎是一個更大的問題,然後我認爲我不能給你一個接受的答案,因爲我的問題還沒有解決,但你得到當然,爲了讓我朝正確的方向發展(我希望),我只是決定嘗試使用dependencyproperty而不是放棄:-)最後一次嘗試! – Stefan

0

它還挺很難說這是怎麼回事,並提供更新的代碼,而是繼續前進,試試這個,讓我知道,如果它工作或沒有:

讓你有什麼從Sankarann的回答完成,但讓我們改變一些XAML。

在你的主窗口XAML文件的頂部,你應該定義你Window繼續前進,添加以下行:

<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}"/> 

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

然後從你的滑塊綁定刪除元素名稱