WPF «изменил» события - PullRequest
       0

WPF «изменил» события

0 голосов
/ 09 июля 2010

Я уже давно использую WPF и довольно привык ко многим (довольно пугающим для непосвященных) функциям: XAML, Binding, Templates, Trigger и т. Д. Но я просто не могу показатьсячтобы полностью понять систему событий.С самого начала у меня на нервах было то, что события, которые называются «измененными» событиями (т.е. ListBox.SelectionChanged или TextBox.TextChanged), запускаются ДО изменения свойства, на которое они ссылаются

99% времени я просто хочу ответить на событие ввода пользователя и посмотреть, каково новое значение.Очень редко мне действительно нужно отвечать перед обновлением элемента управления, чтобы отменить изменение или сохранить предыдущее значение или что-то еще.

Нет смысла называть эти события «измененными» событиями, когда изменение еще не произошло полностью, оно все еще происходит.По крайней мере, для меня было бы гораздо разумнее называть эти события «изменяющимися» событиями, а затем «измененное» событие срабатывало после того, как все было обновлено.

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

Слишком много, чтобы спрашивать, когдаэтот код запускает:

void myTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
     DoSomething(myTextBox.Text);
}

, что myTextBox.Text имеет значение NEW свойства text.Я просто сумасшедший?или я что-то упустил?

Ответы [ 2 ]

1 голос
/ 09 июля 2010

Текстовое поле в вашем примере будет иметь новое значение, если вы подпишетесь на TextChanged.Происходит событие PreviewTextInput.Этот будет действовать, как вы описали, и вам не нравится.

Также SelectionChanged действует, как следует из названия.Единственное, о чем нужно позаботиться, это то, что если у вас есть Binding (SelectedItem), и в качестве цели у него есть другой элемент управления, который построен асинхронно, например, элемент управления TreeView или также ItemsControl-Derivations, может произойти задержказапрашивая свойство назначения.Но это не та проблема, которую вы описываете.

0 голосов
/ 09 июля 2010

Поведение позволяет вам отменить изменение, и эта болевая точка обеспечивает дополнительную гибкость.

Я чувствую вашу боль, но не думаю, что с этим можно что-то сделать. Измените ваш код так:

DoSomething(((TextBox)sender).Text);

... который немного менее ясен, но все еще находится на одной строке.

Или, если вы параноик, по этому поводу:

       TextBox t = sender as TextBox;
       if (t!=null) DoSomething(((TextBox)sender).Text);

Я думаю, что многие будут критиковать выбор обработки событий в коде XAML в пользу модели MVVM, но это решение для вас, а не для них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...