【发布时间】:2014-12-22 18:47:38
【问题描述】:
我已经实现了一个从 RangeBase 派生的自定义 Slider,它具有一个添加的 ResetValue 属性,可用于将 Value 重置为初始值。不幸的是,这需要对值源进行双重绑定,并且还需要对 ResetValue 使用 OneTime 绑定模式。
<ButtonSlider
Minimum="0" Maximum="500" TickFrequency="1"
Value="{Binding Path=MaxVoltageUv}"
ResetValue="{Binding Path=MaxVoltageUv, Mode=OneTime}" />
理想情况下,它应该有一个布尔依赖属性 CanReset,如果启用,它将在第一次绑定时捕获 ResetValue。我尝试通过捕获第一次设置 Value 来实现它,但由于某种原因,这只在某些时候有效。
它首先覆盖 ValueProperty 上的元数据:
ValueProperty.OverrideMetadata(typeof(ButtonSlider), new FrameworkPropertyMetadata(OnValueChanged, OnCoerceValue));
然后实现自定义强制和值更改处理程序。
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var buttonSlider = ((ButtonSlider)d);
if (buttonSlider != null)
{
if (!buttonSlider.valueInitialized && e.NewValue is double)
{
buttonSlider.resetValue = (double)e.NewValue;
buttonSlider.valueInitialized = true;
}
buttonSlider.CheckResetEnabled();
}
}
private static object OnCoerceValue(DependencyObject d, object baseValue)
{
var buttonSlider = ((ButtonSlider)d);
if (buttonSlider != null)
{
if(baseValue is double)
return Math.Max(Math.Min((double)baseValue, buttonSlider.Maximum), buttonSlider.Minimum);
}
return DependencyProperty.UnsetValue;
}
由于某种原因,调用 OnValueChanged 时的值为 0,而初始绑定应为 2。这似乎与数据模板有关。不在数据模板上的控件可以正常工作。
还有其他方法可以获取依赖属性的初始值吗?
【问题讨论】:
-
您能否提供更多关于
OnValueChanged被调用而e.NewValue为0 时的情况的详细信息?那时e.OldValue的价值是多少?是否在该特定时刻在属性上设置了绑定,如果是,绑定源值是什么?该属性的默认值是多少?
标签: c# wpf custom-controls