将Timespan绑定到滑块

时间:2014-01-29 14:06:26

标签: c# wpf data-binding slider

我的程序中有一个间隔保存为TimeSpan。我想将值绑定到Slider以轻松调整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 = this

4 个答案:

答案 0 :(得分:3)

是问题是更改的值不会更新为Binding。我在这里详细说明一下,

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

答案 1 :(得分:2)

这是一个小而功能齐全的例子。 Slider是TwoWay数据绑定到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

答案 2 :(得分:0)

您可以将滑块值绑定到实现INotifyPropertyChanged的模型(Kevin在评论中说)或者代之以处理ValueChanged事件并手动检索新值。

答案 3 :(得分:0)

很难说你的更新代码发生了什么,但请继续尝试,并告诉我它是否有效:

保留你从Sankarann的答案中所做的一切,但是让我们改变一些XAML。

在MainWindow XAML文件的顶部,您应该定义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}"/>