两个WPF滑块的值之间的条件属性绑定

时间:2013-04-09 18:42:37

标签: wpf xaml data-binding

我在XAML中有两个滑块:

<Border Background="Black">
    <StackPanel x:Name="LayoutRoot" Background="#FFB13232" HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal">
        <Image Width="800" Height="600" />
        <Slider x:Name="bigvalue" Orientation="Vertical" Maximum="1" LargeChange="0.1" SmallChange="0.01" Value="1" />
        <Slider x:Name="smallvalue" Orientation="Vertical" Maximum="1" LargeChange="0.1" SmallChange="0.01"/>
    </StackPanel>
</Border>

...我希望达到以下行为:如果bigvalue.Value在滑动期间到达smallvalue.Value并且我继续向下滑动,smallvalue.Value应该更新,类似于滑块游标之间的“碰撞检测”。

(背景:这些将控制将在图像中绘制的对象的顶部位置和底部位置,并且此对象不应具有负(top_position - bottom_position)维度。)

我考虑过使用Property Binding,但我的用例需要一个条件属性绑定,而我很困惑如何实现它。

另外,目前,我更倾向于不进入自制WPF Range Sliders(带有两个光标的滑块)的领域,尽管我同意这将是“正确”的解决方案。

1 个答案:

答案 0 :(得分:2)

您可以创建一个实现所需行为的Range视图模型类:

public class Range : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private double minimum;
    public double Minimum
    {
        get { return minimum; }
        set
        {
            minimum = value;
            OnPropertyChanged("Minimum");

            if (Maximum < Minimum)
            {
                Maximum = Minimum;
            }
        }
    }

    private double maximum;
    public double Maximum
    {
        get { return maximum; }
        set
        {
            maximum = value;
            OnPropertyChanged("Maximum");

            if (Minimum > Maximum)
            {
                Minimum = Maximum;
            }
        }
    }

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

然后将两个Sliders绑定到两个属性MinimumMaximum

<StackPanel>
    <StackPanel.DataContext>
        <local:Range/>
    </StackPanel.DataContext>
    <Slider Value="{Binding Minimum}"/>
    <Slider Value="{Binding Maximum}"/>
</StackPanel>