В критических точках вы можете принудительно привязать привязку к модели представления:
var textBox = Keyboard.FocusedElement as TextBox;
BindingOperations.GetBindingExpression(textBox, TextBox.TextProperty).UpdateSource();
Редактировать:
ОК, поскольку вы этого не сделаетеЧтобы взломать, мы должны столкнуться с ужасной правдой:
- Для реализации чистого представления свойства, предоставляемые вашей моделью представления, должны соответствовать частым обновлениям привязки.
Аналогия, которую мы можем использовать, - это текстовый редактор.Если приложение представляет собой гигантское текстовое поле, привязанное к файлу на диске, каждое нажатие клавиши приведет к записи всего файла.Даже концепция сохранения не нужна.Это неправильно, но ужасно неэффективно.Мы все сразу видим, что модели представления необходимо предоставить буфер для привязки к представлению, и это вновь вводит концепцию сохранения и форсирования обработки состояний в нашей модели представления.
Тем не менее, мы видим, что это все ещенедостаточно эффективно.Даже для файлов среднего размера издержки обновления буфера всего файла при каждом нажатии клавиши становятся невыносимыми.Далее мы представляем команды в нашей модели представления для эффективной манипуляции с буфером, никогда фактически не заменяя весь буфер с представлением.
Таким образом, мы заключаем, что для достижения эффективности и отзывчивости с помощью чистого MVVM нам необходимо предоставитьэффективный вид модели.Это означает, что все текстовые поля могут быть привязаны к свойствам без вредных последствий. Но , это также означает, что вы должны сдвинуть состояние вниз в модель представления, чтобы справиться с этим.И это нормально, потому что модель представления не модель;его задача заключается в том, чтобы справиться с потребностями представления.
Это правда, что мы можем быстро создавать прототипы пользовательских интерфейсов, используя преимущества ярлыков, таких как привязка к изменениям фокуса.Но привязка к изменениям фокуса может иметь негативные последствия в реальных приложениях, и если так, то мы просто не должны использовать это.
Какая альтернатива?Выставьте свойство, дружественное частым обновлениям.Назовите это так же, как называли старое неэффективное свойство.Реализуйте ваше свойство fast, используя свойство slow с логикой, которая зависит от состояния модели представления.Модель представления получает команду сохранения.Он знает, было ли свойство fast перенесено в свойство slow.Он может решить, когда и где свойство slow будет синхронизировано с моделью.
Но вы говорите, разве мы не перенесли хак из вида в модель представления?Нет, мы потеряли некоторую элегантность и простоту, но вернемся к аналогии с текстовым редактором.У нас есть , чтобы решить эту проблему, и задача модели представления - решить ее.
Если мы хотим использовать чистый MVVM и хотим эффективности и отзывчивости, то неубедительные эвристики, такие как давайте избегатьобновление источника привязки, пока элемент не потеряет фокус, не поможет.Они вводят столько проблем, сколько решают.В этом случае мы должны позволить модели представления выполнить свою работу, даже если это означает добавление сложности.
Если мы примем это, как мы можем управлять сложностью?Мы можем реализовать универсальный служебный класс-обертку, чтобы буферизовать свойство slow и позволить модели представления перехватывать методы get и set.Наш служебный класс может автоматически регистрироваться для сохранения командных событий, чтобы уменьшить количество стандартного кода в нашей модели представления.
Если мы все сделаем правильно, то все части модели представления, которые были достаточно быстрыми для использованияс измененным свойством, привязка будет все та же, а другие, которые были достойны задать вопрос "Является ли это свойство слишком медленным?"будет иметь небольшой объем кода для решения проблемы, и представление не является мудрым.