Здравствуйте, notacat, Вы писали:
А>>Суть проблемы: пишется составной контрол — Slider + TextBox, оба элемента привязаны к двухсторонней привязкой к DependencyProperty "Value" этого контрола. Т.е. дергаем слайдер — меняется текст, вводим текст — перемещается слайдер. Соответственно к Value извне также привязывается свойство объекта, над которым мы все эти действия и производим. Внутри самого контрола значение корректируется через CoerceValueCallBack (выход за границы, количество знаков после запятой и т.д.), но вот наружу по биндингу прилетает значение не скорректированное. Получается что биндинг происходит раньше установки самого свойства и, соответственно, до вызова CoerceValueCallback! Как с этим бороться?
N>Поищите в msdn "Dependency Property Value Precedence", почитайте, может понятнее будет.
N>А практически, когда в PropertyChangedCallback прилетает новое значение, там можно проверить, если значение свойства не скорректированное, то явно вызвать CoerceValue для этого свойства. Как-то так:
N>N>if (!DependencyPropertyHelper.GetValueSource(this, e.Property).IsCoerced)
N>{
N> CoerceValue(e.Property);
N> // return;
N>}
N>
MSDN я читал, решения и даже намека на причины такой проблемы там нет. Скорее всего это не проблема DependencyProperty, а проблема биндинга. Получается, что биндинг либо происходит в обход промежуточных свойств (т.е. сразу от конечного источника к конечной цели), либо передает базовое значение. В самом источнике проверять значения очень не хотелось бы, тем более таким изощренным способом, тем более что он является оберткой над нативным кодом и наследоваться от DependencyObject возможности нет.