Как заставить событие TextChanged на WPF TextBox и сохранить фокус? - PullRequest
8 голосов
/ 30 марта 2010

Я создаю числовой текстовый блок в WPF , с двумя кнопками для увеличения и уменьшения значения.

Я создал два RoutedCommand для управления behiavor, и они работают хорошо. Есть только одна проблема, которую я хотел бы решить. Я хотел бы, чтобы элемент управления уведомлял все объекты, связанные с его TextProperty , когда выполняется команда увеличения или уменьшения.

В данный момент отправляет уведомление только когда я изменяю фокус на другой элемент управления

Любая помощь очень ценится, Спасибо

Ответы [ 3 ]

29 голосов
/ 02 марта 2011

Есть простой способ:

Text="{Binding Path=MyProperty, UpdateSourceTrigger=PropertyChanged}"

(я проверял это на TextBox). Удачи

12 голосов
/ 30 марта 2010

Используйте UpdateSourceTrigger="Explicit" в Связывании, а в TextChanged событие обновляет BindingSource. так что вы пишете что-то вроде этого:

<NumericTextBox x:Name="control" Text={Binding Path=MyProperty}/>

вместо этого сделайте вот так

<NumericTextBox x:Name="control" Text={Binding Path=MyProperty, UpdateSourceTrigger=Explicit}/>

и в TextChanged обработчик событий обновляет привязку.

control.GetBindingExpression(NumericTextBox.TextProperty).UpdateSource();

и это сделано. Надеюсь, это поможет !!

2 голосов
/ 31 марта 2010

Поведение по умолчанию для привязки свойства Text на TextBox - обновление на LostFocus. Вы можете изменить это в своем пользовательском элементе управления, переопределив метаданные на TextProperty в вашем статическом ctor:

static NumericTextBox()
{
    TextProperty.OverrideMetadata(
        typeof(NumericTextBox),
        new FrameworkPropertyMetadata("", // default value
            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
            null,  // property change callback
            null,  // coercion callback
            true,  // prohibits animation
            UpdateSourceTrigger.PropertyChanged));
}
...