Textbox.TextChanged срабатывает при загрузке страницы. Как предотвратить это?

У меня проблемы с событием textbox.textchanged. мои текстовые поля привязаны к данным, и когда страница загружается, срабатывает событие textchanged. Как предотвратить это и срабатывать только тогда, когда пользователь вносит какие-либо изменения?


person will0809    schedule 02.11.2011    source источник
comment
Могу я спросить, почему этот первоначальный вызов события является проблемой для начала? Может быть, мы сможем решить проблему, стоящую за проблемой   -  person Amenti    schedule 02.11.2011
comment
привет Аменти. У меня есть страница навигации с кнопкой сохранения и отмены. страница с загрузкой с кучей текстовых полей, изначально заполненных парой значений по умолчанию. Мне нужно ограничить возможность перехода пользователя с этой страницы перед нажатием кнопки сохранения и отмены.   -  person will0809    schedule 02.11.2011
comment
я мог сымитировать нажатие кнопки отмены примерно так: someButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); но это не сработало. Я поместил это после InitializeComponent(). Я делаю это неправильно?   -  person will0809    schedule 02.11.2011


Ответы (4)


Внутри обработчиков событий с измененным текстом вы можете проверить, загружено ли окно (или пользовательский контроль, или что-то еще):

if (this.IsLoaded)
{
   //your logic here
}

Таким образом, вы можете пропустить первое срабатывание событий TextChanged, когда окно еще не загружено.

person icebat    schedule 02.11.2011
comment
Привет айсбат. я пробовал это, но первое, что он поражает после того, как все инициализировано и загружено, - это событие textchanged. Так что все-таки выстрелил. - person will0809; 02.11.2011
comment
разве у вас нет значения по умолчанию, которое вы можете проверить только в первый раз, а затем изменить его? - person MaRuf; 02.11.2011
comment
@ will0809, это странно. Как установить значения по умолчанию? Они привязаны к данным или установлены в коде? - person icebat; 02.11.2011
comment
@icebat, они привязаны к данным. это действительно странно, потому что это работает для другой формы, которую я реализовал. XAML: <bag:InfoTextBox Name="EmailAddress" TextBoxInfo="Enter an E-Mail address" VerticalAlignment="Center" Style="{StaticResource BorderedTextBox}" Width="300" Text="{Binding Path=Email, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> - person will0809; 03.11.2011
comment
в отделенном коде у меня есть это: `void UserConfiguration_PropertyChanged (отправитель объекта, System.ComponentModel.PropertyChangedEventArgs e) { m_IsDirty = true; ОбновитьСообщениеСостояния(); } ` - person will0809; 03.11.2011
comment
а также это: ` Пользователь user = wcf.GetUser(selectedUser.Id); user.PropertyChanged += UserConfiguration_PropertyChanged; ` - person will0809; 03.11.2011
comment
Кажется, проблема не в TextBox, а в слишком раннем срабатывании события PropertyChanged. Возможно, было бы неплохо переместить «user.PropertyChanged += UserConfiguration_PropertyChanged» в обработчик событий Loaded, как показал AkselK в своем ответе. Вы должны установить значения по умолчанию до перехвата события PropertyChanged. - person icebat; 03.11.2011

Проблема в том, что всякий раз, когда устанавливается текст, срабатывает TextChanged. Именно так работает WPF. Вы можете «исправить» это, установив события в отделенном коде, подписавшись на событие Loaded элемента управления Window/Usercontrol. Событие Loaded срабатывает после того, как каждый дочерний элемент и его дочерние элементы завершили загрузку и готовы к отображению.

<UserControl ---- Loaded="UserControl_Loaded">    
-
public void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    _txtBox.TextChanged += txt_changed;
}

public void txt_changed(object sender, RoutedEventArgs e)
{
   (...)
}
person AkselK    schedule 02.11.2011
comment
я думаю, что причина, по которой это не работает, заключается в том, что мои текстовые поля привязаны к данным, а мои значения по умолчанию загружаются в текстовые поля после завершения их загрузки, что приводит к срабатыванию события textchanged. - person will0809; 03.11.2011

Что ж, из вашего комментария я понял, что вы хотите, чтобы пользователь вносил изменения, которые распространяются только на базовые данные, когда он явно сохраняет или закрывает форму.

Вы можете использовать UpdateSourceTrigger "явный " здесь.

<TextBox Text={Binding MyData, UpdateSourceTrigger=Explicit}/>

Таким образом, ваши изменения распространяются только путем явного вызова UpdateSource для ваших привязок, когда ваш пользователь нажимает кнопку сохранения.

Если вы используете MVVM, вы также можете реализовать ту же логику в ViewModels.

person Amenti    schedule 02.11.2011

У меня была такая же проблема, и в итоге мне пришлось работать.

В окне я добавил переменную для загрузки окна и установил для нее значение true в конце события Window_Loaded.

В событиях TextChanged проверьте, является ли ваша переменная истинной.

person GuestTP    schedule 11.03.2014