Re[2]: Binding в WPF
От: MxKazan Португалия  
Дата: 21.07.09 17:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Возможно я плохо объяснил суть проблемы.

А>Вот обещанный код (это просто пример):
Да, не очень хорошо. Из описания казалось, что TextBox и Slider, оба, лежат в UserControl.

А>В этом случае в TextBox`е мы видим значение не скорректированое (Slider выступает как цель привязки)

А>то видим то, что и ожидалось — значение округляется. В этом случае Slider — источник данных.
А>Что это, баг или фича? И что теперь с этим делать?
Ну, это такая реализация DependencyProperty. Если поглядеть call stack при установке свойства в классе Data, то он выведет нас на DependencyObject.SetValueCommon. В этом методе мы увидим, что сначала MySlider проставляет значения через Binding:
...
bool flag2 = false;
if ((expression2 != null) && (expr == null))
{
    if (flag)
    {
        value = ((DeferredReference) value).GetValue(BaseValueSourceInternal.Local);
        flag = false;
    }
    flag2 = expression2.SetValue(this, dp, value); // здесь BindingExpression...
    entryIndex = this.CheckEntryIndex(entryIndex, dp.GlobalIndex);
}
...

и уже в самом конце SetValueCommon вызывается
...
this.UpdateEffectiveValue(entryIndex, dp, metadata, entry, ref entry2, coerceWithDeferredReference, coerceWithCurrentValue, operationType);
...

который внутри себя вызывает CoerceValueCallback

Правильно это или нет, баг или фича, я затрудняюсь ответить. Но сделано так. И в бете 4-го Framework тоже также. Поэтому, как вариант, привязаться к слайдеру. Или еще лучше, отказаться от двусторонней привязки внутри UserControl и реагировать на смену значения Slider через событие. И, кстати, для Slider не нужно указывать Mode=TwoWay, его свойство Value, аналогично TextBox.Text, в метаданных имеет флаг BindsTwoWayByDefault.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.