我正在尝试将双手柄滑块修改为通用双模型。
[更新]: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
问题是,控件不会以任何方式对实现控件时设置的属性做出反应。即使以编程方式编辑属性也不起作用?我认为这是一个愚蠢的错误,但我现在已经倾倒了这段代码了一段时间。有什么想法吗?
编辑:仍然没有运气!输出中没有关于绑定错误的内容。
答案 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。