Я заметил небольшую проблему в WPF. Если вы используете двухсторонние свойства связывания в цепочке (A <-> B, B <-> C, C <-> D ...)
, все будет хорошо, пока вы не представите два или более конвертера.Ошибка связывания цепи
Теперь, с одним преобразователем, он все еще работает, но когда вы добавляете два преобразователя в цепочку (A <x> B, B <-> C, C <x> D ...)
, он может застревать в бесконечном цикле, если свойства меняются достаточно быстро.
Кажется, что WPF очень умный, чтобы избежать бесконечной рекурсии, но если изменения происходят слишком быстро, это препятствует тому, что блокирует вас, и уходит в бесконечность.
Точка, в которой я это заметил, когда я создавал прототипы собственного редактора цветов. Я хотел, чтобы выбор цвета выполнялся с помощью оттенка перекрещивания и легкости, с другой насыщенностью ползунка. Чтобы убедиться, что слайдеры синхронизированы, мне нужно было привязать конвертер (от и до цвета). Теперь я столкнулся с проблемами вычислений, поэтому создал класс, который управлял преобразованием, но делал это только тогда, когда это необходимо, и привязывал все к этому. Проблема в том, что когда я перешел за пределы моего контроля, я ударил бесконечную рекурсию, если пользователь переместился по цветовой палитре очень быстро.
Я проследил его до интересного эффекта. Преобразователь (при настройке как два способа) будет запускаться вперед, а затем быстро назад, чтобы отражать любые потери при преобразовании. Но когда они были привязаны к другому конвертеру, который делал то же самое, они возвращались назад и вперед бесконечно, как пинг-понг.
Это произошло только в том случае, если преобразователи были вызваны достаточно быстро. Поэтому я предполагаю, что переполнил некоторое значение, которое подсчитало стек рекурсии.
Кто-нибудь еще заметил что-либо в этом роде, и как вы можете избежать таких проблем, когда люди используют привязку к свойству «значение результата» вашего элемента управления?
У вас есть небольшой пример compilbale и runnable, демонстрирующий это? –
Код, который у меня есть, слишком громоздкий для изучения. Я попытаюсь имитировать в небольшом примере. Трудно действительно быть уверенным, что происходит, поскольку все эти отскоки имеют свой собственный стек вызовов. –