我似乎对RangeSlider
的任何实现都有同样的问题(或者更简单地说,是一个带有2个拇指的滑块)。
我想将两个拇指绑定到datacontext并将该绑定设置为双向。 不幸的是,我似乎只能将SET绑定到滑块的位置。如果我用鼠标移动它们就会失去它们的绑定。
我使用了几个范围滑块,但为了简单起见,在本例中我使用了thejoyofcode.com中的一个。 (我没有对它进行修改,所以我现在不把它包括在内,但如果它有帮助我可以。) 我使用下面的XAML使用它,目的是让框架滑块(名为“MinSlider”和“MaxSlider”)也绑定到相同的数据源。
当我移动框架滑块时,所有绑定项都跟随它们,包括范围滑块,但是如果我移动范围滑块上的一个拇指,它不更新数据源或框架滑块。
我的窗口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 :(得分:2)
这是因为您需要在BindingMode=TwoWay
中设置Binding
。
Control
作者可以将此作为默认行为(WPF Slider
执行此操作),但除非依赖项属性已在FrameworkPropertyMetadata.BindsTwoWayByDefault
注册,否则OneWay
是将使用的模式。
MSDN解释了BindingMode
s。