"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

Тем не менее это не решает самой проблемы... (это очень печально)

См. также:

Ответ 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);
      }
   }
}