WPF Undo Redo Property System для выделения красным цветом, если значение изменилось
У меня есть следующее требование для очень сложного интерфейса. (Сложный здесь означает, что в форме много элементов управления [приблизительно 100]). Я использую MVVM (если моя проблема требует, чтобы он слегка отошел от MVVM, я согласен с этим)
У меня вопрос к редактируемым ComboBox и TextBox. Но я бы сказал, что мне нравится слышать общий алгоритм, который будет соответствовать всем элементам управления.
Требование 1: пользователь редактирует содержимое и переходит к следующему элементу управления, цвет элемента управления / текста должен стать красным.
Требование 2. Когда пользователь возвращается к ранее отредактированному элементу управления и вводит значение, которое было изначально, цвет элемента управления / текста должен стать черным.
Я знаю, что требование жесткое, и я ломал голову над тем, чтобы разработать общий алгоритм, с помощью которого я могу сохранить предыдущее значение и вызвать функцию для изменения цвета элемента управления.
Чтобы просто дать вам представление,
-> Я пытался сохранить 2 свойства для каждого TextBox, как Default_Text и Text. Но поскольку количество свойств огромно, объем памяти очень велик. Также поддерживать очень много свойств очень сложно.
-> Я пытался добавить словарь в каждую ViewModel, чтобы сохранить, какие значения изменились. Но здесь я столкнулся с проблемой предоставления уникальных ключей всем элементам управления в моем приложении, что не очень полезно
-> Я даже думал и пытался создать подклассы управления, такие как TextBox, ComboBox, и переопределить некоторые методы, чтобы удовлетворить мои требования, но, к сожалению, я потерпел неудачу, когда начал добавлять проверки и все такое.
Поэтому здесь я застрял в разработке общей системы / алгоритма свойств WPF для обработки всех функций отмены повторения, изменения стилей элементов управления и т. Д.!!!
Было бы здорово, если бы вы, эксперты, могли направить меня в правильном направлении, а также помочь мне в разработке такого алгоритма / системы. Образец иллюстрации будет хорош, хотя!
2 ответа
Я нашел ответ на вышеуказанную проблему. Я использовал прикрепленное поведение для этого. Подробнее об этой ссылке Вызов функции из XAML из StackOverFlow.
Когда я связываю данные, я сохраняю начальное значение переменной DataBound в свойстве Tag, используя Binding=OneWay. Затем я написал прикрепленное поведение для события LostFocus.
Всякий раз, когда пользователь вводит элемент управления, а затем переходит к другому элементу управления, он запускает событие LostFocus и вызывает мое присоединенное поведение. В этом я проверяю, равно ли значение значению в теге. Если это то же самое, я показываю черным, а я показываю красным.
Прикрепленное поведение пород в WPF. Я могу добиться чего-то от этого чисто, без помех кода!!!!
Другой альтернативой является использование некоторого "грязного" отслеживания в ваших моделях (или моделях представления) и связывание со свойствами isdirty (и преобразование его в цвет).