Можно ли в Silverlight определить минимальные/максимальные значения для DependencyProperty?

Например, у меня есть свойство зависимости, которое изменяет ScaleTransform Canvas, но если оно когда-либо становится ниже нуля, оно выдает ошибку. Конечно, я мог бы просто принудительно обнулить его в коде, если это когда-либо произойдет, но я бы предпочел использовать лучший метод, например, использовать udouble (двойное число без знака), которого нет в Silverlight, или даже установить минимальные/максимальные значения. где-то в DependencyProperty.

Какой лучший подход здесь?


person jedmao    schedule 29.07.2009    source источник


Ответы (2)


Если вы собираетесь обрабатывать это в своем DependencyProperty, я бы рекомендовал обрабатывать его в PropertyChangedCallback, который проверяет, находится ли значение в правильном диапазоне, и переопределяет его, если это не так.

Вы также можете обработать это вне свойства зависимости. Например:

person Jon Galloway    schedule 29.07.2009
comment
Это то, что я в итоге сделал — изменил его в PropertyChangedCallback, но я искал альтернативу. Спасибо за дополнительные ссылки здесь. - person jedmao; 02.08.2009
comment
Не могли бы вы опубликовать пример того, как вы можете безопасно/чисто переопределить только что измененное значение? Если вы измените его, он вызовет все событие/обратный вызов OnChanged во второй раз. - person Stephen Price; 22.10.2010

Просто чтобы добавить к этому, внутри вашего 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 «только для чтения» аналогичным образом, хотя для этого потребуется закрытое поле, чтобы указать, устанавливаете ли вы значение или отменяете его изменение.

person Jeff Wilcox    schedule 02.08.2009