Pull to refresh

Comments 5

Из кода и предупреждений анализатора видно, что свойства 'Left' и 'Top' объекта 'window' записываются сами в себя. Для некоторых случаев такой вариант действий приемлем, например, когда на метод доступа свойства 'повешена' специальная логика.

Он имеет смысл, но неприемлем. Это нарушение принципа «наименьшего сюрприза».
Когда я читаю код типа:
obj.Left = obj.Left;

Я ожидаю, что это NOP (возможно, длительный NOP, но все же NOP).
Из кода и предупреждений анализатора видно, что свойства 'Left' и 'Top' объекта 'window' записываются сами в себя. Для некоторых случаев такой вариант действий приемлем, например, когда на метод доступа свойства 'повешена' специальная логика. Однако для этих свойств никакой дополнительной логики нет, поэтому причины написания такого кода остаются неясными.
А там точно нет никакой дополнительной логики? Это же WPF, тут изменение любого свойства вызывает событие-уведомление об изменении. Таким образом, после присвоение свойства самому себе вызываются обработчики, слушающие изменения этого свойства.

Конечно же, такое решение — всегда костыль. Но это рабочий костыль…
По стандартам WPF:
1. Событие PropertyChanged в таких случаях вызывают напрямую.
2. В свойствах первым делом проверяют, что присваиваемое значение не равно текущему — иначе никаких событий не вызывается.
Хотя, конечно, можно извернуться и проигнорировать рекомендации, и навесить на такую строку какое-то нужное поведение, но это уже слишком.
Во-первых, для DependencyProperty это событие нельзя вызвать напрямую. Оно вызывается только через присвоение значения.

Во-вторых, никакой проверки на то, что присваиваемое значение не равно текущему — не делается ни в свойстве, ни на уровне DependencyProperty. Рекомендаций по поводу таких проверок я тоже нигде не видел.

Напоминаю, что используются стандартные свойства стандартного же класса Window.
Да, виноват, про DependencyProperty не подумал. Я про чистые INotifyPropertyChanged написал.
Sign up to leave a comment.