DependencyProperty с CoerceValueCallback ведет себя странноC#

Место общения программистов C#
Anonymous
DependencyProperty с CoerceValueCallback ведет себя странно

Сообщение Anonymous »

В настоящее время я борюсь с DependencyProperties в WPF.
Полный код можно найти здесь: https://github.com/JYPDWhite/WPFValueCorrectionTest
В этом коде у меня есть две проблемы, которые я не могу понять, как исправить.
Код содержит OwnControl, который является производным от UserControl, он содержит Свойство зависимости или NumberProperty.
Зарегистрирован метод coerceValueCallback, который приводит заданное число к 0, когда заданное значение >5.

Код: Выделить всё

public static readonly DependencyProperty NumberProperty = DependencyProperty.Register(
nameof(Number),
typeof(int),
typeof(OwnControl),
new FrameworkPropertyMetadata(
defaultValue: 2,
flags: FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
propertyChangedCallback: PropertyChangedCallback,
coerceValueCallback: CoerceNumberValue));

private static object CoerceNumberValue(DependencyObject d, object baseValue)
{
OwnControl depObject = (OwnControl)d;
var newValue = (int)baseValue;
var correctedNumber = depObject.CheckNumber(newValue);

return correctedNumber;
}

public int Number
{
get { return (int)GetValue(dp: NumberProperty); }
set { SetValue(dp: NumberProperty, value); }
}

private int CheckNumber(int newValue)
{
if (newValue < 5)
{
return newValue;
}

return 0;
}
Принудительное значение правильно сохраняется в OwnControl, чтобы распространить исправление обратно в модель представления. Я использую это свойствоChangedCallback, где привязка обновляется с помощью BindingOperations.

Код: Выделить всё

private static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (!Equals(e.OldValue, e.NewValue))
{
d.SetCurrentValue(dp: NumberProperty, e.NewValue);
d.Dispatcher.BeginInvoke(new Action(() =>
{
var be = BindingOperations.GetBindingExpression((OwnControl)d, dp: NumberProperty);
if (be == null)
{
Debug.WriteLine("Istnull");
}
be?.UpdateSource();
}), DispatcherPriority.ContextIdle);
}
}
Кажется, это работает нормально. Если я введу 2 в качестве входных данных, ViewModel и OwnControl получат правильное значение. Затем я ввожу 5, значение приводится, и изменение отражается в OwnControl и ViewModel.
Но когда я теперь ввожу, например, 6 (заменяя 0 в поле ввода), я вижу, что приведение выполняется, и OwnControl получает правильное значение 0.
Но отладчик не работает через PropertyChangedCallback и, следовательно, также в ViewModel 6 по-прежнему является сохраненным значением.
Вопрос 1: Почему происходит сбой обновления принудительного значения при повторном вводе «неправильного» числа?
Вопрос 2: В DependencyProperty.Register defaultValue установлено в 2, но при запуске я вижу в отладчике при нажатии точки останова в PropertyChangedCallback, что изначально значение установлено в 2, но первое попадание отладчика в Den PropertyChangedCallback oldValue равно 2, а newValue равно 0. Откуда берется 0?

Вернуться в «C#»