А>Что это, баг или фича?
На этот вопрос ответа не знаю. Скорей всего фича, если бы был баг, то его бы уже исправили.
A>И что теперь с этим делать?
Я советую в класс MySlider для ValueProperty добавить PropertyChangedCallBack и посмотреть, что там происходит. По идее, то, что я писала первый раз — в этом методе явно вызывать CoerceValue, должно сработать. Если этого почему-либо не хочется делать, то хотя бы в отладчике поизучаете, какое значение прилетает и откуда. DependencyPropertyHelper.GetValueSource(this, e.Property) вернет ValueSource, из которого это можно будет понять.
public static DependencyProperty ValueProperty =
DependencyProperty.Register("Value",
typeof (decimal),
typeof (MySlider),
new FrameworkPropertyMetadata((decimal) 0,
new PropertyChangedCallback(OnValueChanged),CoerceValueCallback));
private static object CoerceValueCallback(DependencyObject d, object basevalue)
{
return Math.Round((decimal) basevalue, 2);
}
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MySlider slider = d as MySlider;
ValueSource source = DependencyPropertyHelper.GetValueSource(slider, e.Property);
// вот тут можно поизучать source
if (!source.IsCoerced)
{
slider.CoerceValue(e.Property);
}
}