Здравствуйте, gandjustas, Вы писали:
C>>Простой пример — два поля. В одно поле вводят число, другое поле показывает процент от этого числа, оба поля редактируемые. Соответственно, если пользователь меняет одно поле, то должно поменяться другое. G>Two-way binding + converter вы считаете такой сложностью? WPF с этим спокойно справляется.
А теперь идём дальше. Например, нужно учитывать, что если мы редактируем деньги, то нам нужно иногда округлять их до десятков центов.
Т.е. имеем сумму $5.00 в поле денег, и 100% в поле ввода процентов. Меняем 100% на 73% — должно получиться $3.60 ($3.65 округлённый в меньшую сторону), так что процент должен скомпенсироваться до 72%. Или наоборот, нужно иметь целые проценты, но при редактировании суммы дробные проценты нужно округлять.
И иногда это нужно делать через цепочку промежуточных преобразований.
В простых случаях можно пробовать вызывать из ConvertBack из Convert (и наоборот), но если нужно что-то более сложное — то упс. Ну и сам интерфейс конвертера не особо приятный. Мало информации о контексте преобразования и его истории, нет чётких механизмов ветирования и отката изменений до вычисленного корректного состояния и т.п.
Плюс, многие формулы валидации работают в одном направлении (и решать их в обратном направлении — совсем недосуг). Мне для binding'а пришлось вообще прикручивать логический движок, а ты говоришь "простой two-way"...
Мне пока единственное что не нравится — у меня биективные преобразования ничем не проверяются (т.е. из-за глюков они бывают и не биективными), поэтому и хочется механизм линз прикрутить и переделать на них большую часть вычислений. Единственное, что пока не разобрался что делать с решателем ограничений.
C>>Или другой пример — колонка чисел и сумма. Можно редактировать отдельные поля и поле суммы. При редактировании поля суммы по хитрым правилам должны редактироваться слагаемые. Причём слагаемые могут меняться динамически (например, изменили сумму до $100 — и одно поле заменилось другим, а все значения пересчитались, а если изменили до $110 — это поле снова исчезнет). G>Это уже MVVM использовать надо, и байндиться на свойства ViewModel.
И она будет повторять визуальную модель.