Я работаю над приложением UWP и понял, что режим UpdateSourceTrigger
по умолчанию для элемента управления TextBox
, который является LostFocus
, не может быть изменен при использовании скомпилированной привязки.
Это означает, что всякий раз, когда я хочу обновить привязку для TextBox
, я должен использовать все эти повторяющиеся шаблоны:
<TextBox
Text="{x:Bind ViewModel.Title, Mode=TwoWay}"
TextChanged="TextBox_OnTextChanged"/>
private void TextBox_OnTextChanged(object sender, TextChangedEventArgs e)
{
ViewModel.Title = ((TextBox)sender).Text;
}
Теперь это не так уж плохо, но нужно помнитьсоздавать обработчик TextChanged
каждый раз, когда используется TextBox
, раздражает и подвержен ошибкам.
Это будет нормально работать с классической привязкой:
<TextBox Text="{Binding Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
Но, конечно,здесь могут возникнуть дополнительные издержки при использовании классических привязок usinc (включая отражения во время выполнения и т.Я был бы вполне согласен, скажем, с написанием пользовательского присоединенного свойства, которое настраивает вещи, если я могу делать все, что мне нужно, прямо из XAML, без участия кода.
Спасибо!
ОБНОВЛЕНИЕ: (в ответ на Нико Чжу - ответ MSFT)
Для моего тестирования это работает хорошо.
Это вообще не для меня, как я уже говорил несколько раз, использование UpdateSourceTrigger
с x:Bind
просто невозможно .Он не компилируется, свойство отображается красным цветом в редакторе XAML, просто его там нет.Я действительно не знаю, где вы пытаетесь это сделать, если вы говорите, что это работает для вас.В настоящее время я нацеливаюсь как минимум на 17763, и я могу на 100% гарантировать, что это работает , а не .
Скомпилированное связывание используется с синтаксисом {x: Bind} в отличие отсинтаксис {Binding} классической привязки.
Я хорошо знаю разницу, я уже упоминал об этом несколько раз, как в моем первоначальном вопросе здесь (также с фрагментами кода), а такжекак в моих комментариях.
Он по-прежнему использует уведомляющие интерфейсы (например, INotifyPropertyChanged) для отслеживания изменений
Как я уже сказал, я тоже об этом знаю.Но опять же, как и из этого вопроса, это не проблема здесь вообще.Проблема заключается в не с обновлениями от модели представления до связанного свойства, но с связанного свойства (в данном случае TextBox.Text) до viewmodel.
{x:Bind}
по умолчанию OneTime по сравнению с {Binding}, который является OneWay.поэтому вам нужно объявить режим связывания OneWay или TwoWay для {x: Bind}.
Извините, но я должен сказать, что на данный момент я начинаю задумываться, действительно ли выпрочитайте мой начальный вопрос вообще.Я знаю об этом, и на самом деле вы можете видеть в обоих моих исходных фрагментах кода, что я уже использовал явное свойство Mode=TwoWay
в обеих моих привязках.
И снова, это был , а не , о чем вообще был вопрос.
Повторюсь: проблема здесь в том, что свойство TextBox.Text
по умолчанию имеет триггер LostFocus
, и что UpdateSourceTrigger
свойство не доступно для скомпилированных привязок.Поэтому я хотел бы знать, есть ли способ добиться того же с помощью скомпилированной привязки, только в XAML, без необходимости вручную создавать обработчик TextChanged
каждый раз (и если нет, если вы планируете в конечном итоге добавитьсвойство UpdateSourceTrigger
также для скомпилированных привязок).
Примечание: я не хотел показаться здесь неуважительным, и я надеюсь, что мы теперь разрешили существующие недоразумения с моим вопросом.
UPDATE # 2: выясняет, что проблема была вызвана плагином ReSharper, который помечал свойство UpdateSourceTrigger
как ошибку в скомпилированных привязках.Я открыл для этого вопрос здесь: https://youtrack.jetbrains.com/issue/RSRP-474438