"UpdateSourceTrigger = PropertyChanged" эквивалентен для TextBox в WinRT-XAML
В WPF мы можем обновлять базовую модель данных всякий раз, когда пользователь вносит какие-либо изменения в данные, используя UpdateSourceTrigger следующим образом:
<TextBox Text="{Binding Path=TextProperty, UpdateSourceTrigger=PropertyChanged}"/>
В окне Phone Phone UpdateSourceTrigger не был включен в спецификацию XAML и для достижения этого был необходим обработчик TextChanged следующим образом:
(sender as TextBox).GetBindingExpression(TextBox.TextProperty).UpdateSource();
В Windows 8 я предположил, что UpdateSourceTrigger также будет опущен - я был прав. Однако я был удивлен, узнав, что GetBindingExpression() также отсутствует.
Каков наилучший способ выполнения в Windows 8 того, что мы выполнили в WPF с помощью UpdateSourceTrigger и в Windows Phone с GetBindingExpression(). UpdateSource()?
Обратите внимание: этот вопрос предназначен для разработки Windows 8 (Metro); этот другой вопрос ( "UpdateSourceTrigger = PropertyChanged" эквивалентен для Windows Phone 7 TextBox) предназначен для разработки Windows Phone - не путать.
В рамках исследования этот пример (который я создал) использует переопределение TextBox для замены текстового значения между двумя свойствами, вызывающими Обновить. Он основан на этом. Но есть ли лучший способ? Что-то элегантное?
Ответы
Ответ 1
Кажется, нет GetBindingExpression
или эквивалентного обходного пути. Однако вы можете расширить TextBox следующим образом: https://mytoolkit.svn.codeplex.com/svn/WinRT/Controls/ExtendedTextBox.cs
Тем не менее это не решает самой проблемы... (это очень печально)
См. также:
Ответ 2
Кажется, что UpdateSourceTrigger
и GetBindingExpression
доступны в Windows 8.1. Благодаря Rico Suter выше и HDW Production из этого вопроса:
Windows Store TextBox - Как обновить привязку при вводе клавиш?
Ответ 3
Джерри,
Образец, который вы должны использовать, будет реализовывать INotifyPropertyChanged.
Heres и пример из MSDN: http://msdn.microsoft.com/en-us/library/ms229614.aspx
Таким образом, любой объект XAML, привязанный к свойству или поле поддержки, будет уведомлен, когда значение поля поддержки изменилось из-за вызова метода NotifyPropertyChanged().
Если бы вы реализовали этот шаблон, вам не нужно было бы явно определять, когда обновлять пользовательский интерфейс, все элементы пользовательского интерфейса, привязанные к Notifyable propertytied, будут, как вы ожидаете, Update при изменении Source.
Для классов, которые реализуют INotifyPropertyChanged
Я использую фрагмент, чтобы создать большинство моих свойств, подобных этому (если есть вероятность, что они будут связаны или должны будут уведомить другой объект):
private PropertyChangedEventArgs myVarChangedEventArgs = new PropertyChangedEventArgs("MyProperty");
private int myVar;
public int MyProperty
{
get { return myVar; }
set
{
if (myVar != value)
{
myVar = value;
NotifyPropertyChanged(myVarChangedEventArgs);
}
}
}