Уместно ли бросить исключение из CoerceValueCallback - PullRequest
8 голосов
/ 12 сентября 2010

Целесообразно ли выдавать исключение из CoerceValueCallback, если заданное значение недопустимо или следует использовать только ValidateValueCallback для проверки значения DP?

Ответы [ 2 ]

1 голос
/ 20 октября 2010

CoerceValue действительно должен использоваться для фиксации значения (например, ограничить его минимальным и максимальным значением).Я не знаю, вызовет ли исключение сбой приложения (вам просто нужно проверить это, чтобы выяснить это), или фреймворк справится с этим, но я бы не стал его рекомендовать, потому что это противоречило бы хорошей практике кодирования.

Чтобы получить дополнительную информацию для ValidateValue, вам иногда приходится определять дополнительные поля в вашем классе.Вы можете либо связать эти поля, либо установить их до установки значения для вашего DP, затем в ValidateValue вы можете получить доступ к этим полям и получить необходимую дополнительную информацию.Это дополнительное поле, создающее и передающее информацию через промежуточные «слои», кажется Microsoft вполне приемлемым, потому что именно так они (недальновидно) разработали структуру.

Я приведу пример новой сетки данных WPF.Если вы пойдете по стандартному маршруту и ​​определите RowValidationRule, вы ожидаете, что у вас будет доступ к заказу ItemsSource (ваша таблица), чтобы определить, существует ли уже заданное значение в вашей строке в таблице.Это очень стандартная вещь, но эта информация не предоставляется в обратном вызове проверки.Таким образом, вы должны создать поле в своем классе проверки, к которому вы можете привязать ItemsSource DataGrid, после чего вы сможете получить доступ к этому полю во время проверки ...

0 голосов
/ 08 октября 2010

первый: мне потребовалось некоторое время, чтобы понять, что DP означает свойство зависимости.

секунда: насколько я понял, CoerceValueCallback предназначен для фиксации значения свойства к заданному значению, а не для проверки значения. Таким образом, я бы выбрал ValidateValueCallback для проверки. Разве это не называется?

...