В Silverlight можно ли определить минимальные / максимальные значения для DependencyProperty?
-
05-07-2019 - |
Вопрос
Например, у меня есть свойство dependency, которое изменяет ScaleTransform холста, но если оно когда-либо опускается ниже нуля, это выдает ошибку.Конечно, я мог бы просто принудительно обнулить его в коде, если это когда-нибудь произойдет, но я бы предпочел использовать лучший метод, такой как использование udouble (unsigned double), которого не существует в Silverlight, или даже установка значений min / max где-нибудь в DependencyProperty.
Каков здесь наилучший подход?
Решение
Если вы собираетесь обрабатывать это в своем DependencyProperty, я бы рекомендовал обрабатывать это в Обратный вызов PropertyChanged, который проверяет, что значение находится в правильном диапазоне, и переопределяет его, если нет.
Вы также могли бы обработать это вне свойства dependency.Например:
- A преобразователь значений
- Применение этого в модели и привязка к ViewModel, которая всегда имеет допустимое значение.Видишь подробнее о MVVM здесь.
Другие советы
Просто добавьте, что в свойстве PropertyChangedCallback типичный шаблон будет возвращаться к неправильным значениям / значениям, выходящим за пределы диапазона, прежде чем выдать исключение.
Если вы не выполните возврат, значение вне диапазона будет фактически установлено, и ваше состояние будет недействительным.
Вы увидите примеры этого "принуждения бедняка" в некоторых из Silverlight Toolkit. Вот источник AutoCompleteBox.cs .
>Шаблон выглядит примерно так:
int newValue = (int)e.NewValue;
if (newValue < 0)
{
source._ignorePropertyChange = true;
d.SetValue(e.Property, e.OldValue);
throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, Properties.Resources.AutoComplete_OnMinimumPopulateDelayPropertyChanged_InvalidValue, newValue), "value");
}
Вы также можете создать собственный " только для чтения " Свойства зависимостей Silverlight аналогичным образом, хотя потребуется личное поле, чтобы указать, устанавливаете ли вы значение или возвращаете его.