破碎的东西 - WPF + DependancyProperties

时间:2012-05-16 21:36:33

标签: c# wpf xaml

我正在尝试将双手柄滑块修改为通用双模型。

[更新]:XAML代码:

<Slider x:Name="LowerSlider" DataContext="this" Template="{StaticResource simpleSlider}" Margin="10,0,0,0"
            IsEnabled="{Binding Path=IsUpperSliderEnabled}"                  
            Minimum="{Binding Path=Minimum}"
            Maximum="{Binding Path=Maximum}"
            Value="{Binding Path=LowerValue}"                
            SmallChange="{Binding Path=SmallChange}" 
            LargeChange="{Binding Path=LargeChange}" />
    <Slider x:Name="UpperSlider" DataContext="this" Template="{StaticResource simpleSlider}" Margin="10,0,0,0"
            IsEnabled="{Binding Path=IsUpperSliderEnabled}"                  
            Minimum="{Binding Path=Minimum}"
            Maximum="{Binding Path=Maximum}"
            Value="{Binding Path=UpperValue}"                
            SmallChange="{Binding Path=SmallChange}" 
            LargeChange="{Binding Path=LargeChange}" />

C#代码隐藏:

 #region Dependency Property - Minimum
    public Double Minimum
    {
        get { return (Double)GetValue(MinimumProperty); }
        set { SetValue(MinimumProperty, value); }
    }

    public static readonly DependencyProperty MinimumProperty =
        DependencyProperty.Register("Minimum", typeof(Double), typeof(DualHandleSlider), new UIPropertyMetadata(0.0));
    #endregion

    #region Dependency Property - Lower Value
    public Double LowerValue
    {
        get { return (Double)GetValue(LowerValueProperty); }
        set { SetValue(LowerValueProperty, value); }
    }

    public static readonly DependencyProperty LowerValueProperty =
        DependencyProperty.Register("LowerValue", typeof(Double), typeof(DualHandleSlider), new UIPropertyMetadata(0.0));
    #endregion

    #region Dependency Property - Upper Value
    public Double UpperValue
    {
        get { return (Double)GetValue(UpperValueProperty); }
        set { SetValue(UpperValueProperty, value); }
    }

    public static readonly DependencyProperty UpperValueProperty =
        DependencyProperty.Register("UpperValue", typeof(Double), typeof(DualHandleSlider), new UIPropertyMetadata(5.0, new PropertyChangedCallback(OnUpperValueChanged)));

    public static void OnUpperValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {

    }
    #endregion

    #region Dependency Property - Maximum
    public Double Maximum
    {
        get { return (Double)GetValue(MaximumProperty); }
        set { SetValue(MaximumProperty, value); }
    }

    public static readonly DependencyProperty MaximumProperty =
        DependencyProperty.Register("Maximum", typeof(Double), typeof(DualHandleSlider), new UIPropertyMetadata(10.0, new PropertyChangedCallback(OnMaximumChanged)));

    public static void OnMaximumChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        DualHandleSlider slider = (DualHandleSlider)d;

        if (slider.IsUpperValueLockedToMax)
        {
            slider.UpperValue = (Double)e.NewValue;
        }
    }

    #endregion

    #region Dependency Property - Small Change
    public double SmallChange
    {
        get { return (double)GetValue(SmallChangeProperty); }
        set { SetValue(SmallChangeProperty, value); }
    }

    // Using a DependencyProperty as the backing store for SmallChange.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SmallChangeProperty =
        DependencyProperty.Register("SmallChange", typeof(double), typeof(DualHandleSlider),
            new UIPropertyMetadata(1.0, new PropertyChangedCallback(OnSmallChangePropertyChanged)));

    protected static void OnSmallChangePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(e.NewValue);
    }
    #endregion

    #region Dependency Property - Large Change

    public double LargeChange
    {
        get { return (double)GetValue(LargeChangeProperty); }
        set { SetValue(LargeChangeProperty, value); }
    }

    // Using a DependencyProperty as the backing store for LargeChange.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty LargeChangeProperty =
        DependencyProperty.Register("LargeChange", typeof(double), typeof(DualHandleSlider),
                new UIPropertyMetadata(1.0, new PropertyChangedCallback(OnLargeChangePropertyChanged)));

    protected static void OnLargeChangePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(e.NewValue);
    }
    #endregion

问题是,控件不会以任何方式对实现控件时设置的属性做出反应。即使以编程方式编辑属性也不起作用?我认为这是一个愚蠢的错误,但我现在已经倾倒了这段代码了一段时间。有什么想法吗?

编辑:仍然没有运气!输出中没有关于绑定错误的内容。

Odd behaviour!

2 个答案:

答案 0 :(得分:2)

在最新编辑之前,您已接近初始代码。关键是命名用户控件并绑定用户控件。如果您支持嵌入式DataContext,这允许ContentControl自然地流过。将DataContext="this"字面设置为字符串 "this"

而是将x:Name="ThisControl"之类的内容添加到<UserControl...行,然后将绑定更新为指向ElementName=ThisControl。确保Slider.Value绑定为Mode=TwoWay(如果您未指定模式,则为默认值):

<UserControl x:Class="NameSpace.ThisControl"
             x:Name="ThisControl">
<Grid>
    <Slider x:Name="LowerSlider"
            IsEnabled="{Binding IsUpperSliderEnabled, ElementName=ThisControl}"
            Minimum="{Binding Minimum, ElementName=ThisControl}"
            Maximum="{Binding Maximum, ElementName=ThisControl}"
            Value="{Binding LowerValue, ElementName=ThisControl}"
            SmallChange="{Binding SmallChange, ElementName=ThisControl}"
            LargeChange="{Binding LargeChange, ElementName=ThisControl}" />
    <Slider x:Name="UpperSlider"
            IsEnabled="{Binding IsUpperSliderEnabled, ElementName=ThisControl}"  
            Minimum="{Binding Minimum, ElementName=ThisControl}"
            Maximum="{Binding Maximum, ElementName=ThisControl}"
            Value="{Binding UpperValue, ElementName=ThisControl}"
            SmallChange="{Binding SmallChange, ElementName=ThisControl}" 
            LargeChange="{Binding LargeChange, ElementName=ThisControl}" />

答案 1 :(得分:1)

您是否将控件DataContext属性设置为正确的值?您可以看到输出窗口以查看您可能具有的绑定错误。

编辑:使用ElementName = root,您可以将绑定指向名为root的绑定。执行此操作的常规方法(IMHO)是删除所有绑定的ElementName部分,并将DataContext = this设置为能够绑定到自己的DP。