WPF范围滑块没有绑定

时间:2013-08-08 15:28:57

标签: wpf binding rangeslider

我似乎对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));
    }

}

1 个答案:

答案 0 :(得分:2)

这是因为您需要在BindingMode=TwoWay中设置Binding

Control作者可以将此作为默认行为(WPF Slider执行此操作),但除非依赖项属性已在FrameworkPropertyMetadata.BindsTwoWayByDefault注册,否则OneWay是将使用的模式。

MSDN解释了BindingMode s。