我的程序中有一个间隔保存为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
答案 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); }
}
}
}
<强>撷取画面强>
答案 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}"/>