2013-06-24 7 views
1

Я использую базовый TextBox, привязанный к объекту. В принципе, то, что я хочу сделать, это вызов метода каждый раз, когда текст в поле редактируется, и пользователь отменяет выбор этого поля или когда редактируются связанные данные границы. То, что я использую сейчас это событие TextChanged, но есть несколько проблем:TextBox Проблемы с обработкой TextChanged

  1. Он вызывается, когда TextBox сначала создается, и я не хочу этого.

  2. Он вызывается каждый раз, когда добавляется новый символ, и я хочу, чтобы он вызывался только тогда, когда изменяются связанные данные границы (что кажется, когда фокус смещается из окна).

Как это сделать?

EDIT: Я пробовал несколько других свойств TextBox, таких как Get/LostFocus, но они никогда не срабатывают.

Кроме того, я не хочу, чтобы этот метод вызывал в Setter свойства, потому что базовые данные - это то, что логически отделено от пользовательского интерфейса этого проекта, и мне не нужны вызовы методов, которые связаны для выполнения вычислений для пользовательского интерфейса.

+1

поставить логику в настройщике свойства. –

+0

Я добавил несколько замечаний, обращаясь к этим вопросам. – TSM

+1

'Кроме того, я не хочу, чтобы этот метод вызывал в Setter свойства' - для этого и нужен ViewModel. –

ответ

0

каждый раз, когда текст в окне редактируется, и пользователь де-выбирает ящик

Хммм AFAIK это стандартное поведение TextBox, если связывать текст так: Text={Binding Property}

, когда редактируются базовые данные привязки

Вы можете предоставить эту функциональность внутри сеттера вашего приложения RTY.

1

Событие LostFocus срабатывает при смещении фокуса с текущего элемента. Я попробовал, и он отлично работает.

+0

Я не уверен, почему он не работал раньше. Возможно, я тестировал его на неправильном шаблоне, но, во всяком случае, он работает сейчас ... – TSM

0

Лучший дизайн - это прослушивание изменений основного свойства привязки. Это можно сделать без изменения настройки, если вы используете DependencyProperty или если ваш объект реализует INotifyPropertyChanged.

При изменении базового свойства (LostFocus по умолчанию или каждый символ за раз) является обязательным.

Если вы не хотите следовать моему совету при прослушивании изменений в вашей (view-) модели, вы можете подписаться на события GotFocus и LostFocus. Сохраните текущее значение, когда вы получите фокус, сравните с текущим значением, когда вы его потеряете. Если все по-другому - сделайте то, что вы хотите сделать.

1

Как пишет jods, лучший способ привязать текст TextBox к свойству ViewModel.Кодекс являются:

Вид:

<TextBox x:Name="TextBox1" Text="{Binding Path=Text1,Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/> 

ViewModel:

public string Text1 
    { 
     get { return _text1; } 
     set 
     { 
      _text1 = value; 
      RaisePropertyChanged("Text1"); 
     } 
    } 

Посмотреть код позади:

private void ViewModelPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "Text1") 
     { 
      //Call UI related method... 
     } 
    } 

Таким образом, чтобы она удовлетворяла ваши два условия: 1. Каждый раз, когда вы редактируете TextBox и теряете фокус, вызывается Setter Text1 и ViewModel wil l активирует событие PropertyChanged. 2. При изменении базового Text1. Text1 также поднимет событие, чтобы View мог его знать.

Также можно избежать ваших двух проблем: 1. В первый раз привязка вызывается только getter Text1. Никакого события не возникает. 2. Setter Text1 вызывается только после того, как TextBox потерял фокус.

-1

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

Смежные вопросы