2014-12-03 4 views
2

У меня возникли проблемы с редактируемым ComboBox и обновлением привязки. В настоящее время у меня есть ComboBox, где UpdateSourceTrigger = LostFocus это потому, что мне нужно дождаться, когда пользователь закончит ввод somthing, прежде чем я решите, является ли значение новым значением (и тем самым создает новый).Обновление привязки Force после завершения выбора ComboBox MVVM

К сожалению, у меня есть еще одна функция, которая требует привязки для обновления при изменении значения. Aka, LostFocus в этом случае не годится. Выбрав новое значение в ComboBox, оно не приводит к потере функции LostFocus (очевидно). Поэтому мне нужно найти способ принудительно обновить привязку.

Я посмотрел в SelectionChanged и заставляя обновления на связывании:

<i:EventTrigger EventName="SelectionChanged"> 
     <i:InvokeCommandAction Command="{Binding ParentConversation.ViewModel.ComboSelectionChanged}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type controls:StoryForgeComboBox}}}"/> 
    </i:EventTrigger> 

и обновление привязки в код следующим образом:

be = BindingOperations.GetBindingExpression(ele, ComboBox.TextProperty); 
if (be != null) 
{ 
    be.UpdateSource(); 
} 

К сожалению, я CAN NOT обновление связывания на данный момент, поскольку значение еще не изменилось. См. Эту статью в разделе stackoverflow: ComboBox- SelectionChanged event has old value, not new value

Существует трюк, в котором вы можете использовать событие DropDownClosed, а затем обновлять привязку, это работает, но не работает, если вы используете клавиши со стрелками вверх/вниз, которые никогда не открывают ComboBox. Также подключиться к KeyUp и KeyDown слишком рано. Невозможно обновить привязку.

Так что мой вопрос в том, когда самое время сказать: «Привет, комбо-бокс, теперь вы можете обновить свои привязки».

Cheers.

+0

«Итак, мне нужно найти способ принудительно обновить привязку» - чего именно вы хотите достичь? В MVVM ViewModel реализуется ['INotifyPropertyChanged'] (http://msdn.microsoft.com/en-us/library/ms743695.aspx), так что обновление из источника происходит неявно, если вы изменяете значение свойства (или явно, если вы поднимаете событие) и в другом направлении, в источник, это (как вы говорите) 'UpdateSourceTrigger = ValueChanged'. Какая из ваших проблем? – Sinatr

ответ

3

Вы можете изменить триггер SelectionChanged событий для LostFocus:

<ComboBox 
     IsEditable="True" 
     ItemsSource="{Binding Items}" 
     SelectedItem="{Binding SelectedItem}" 
     Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger 
       EventName="LostFocus"> 
       <i:InvokeCommandAction 
        Command="{Binding Command}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </ComboBox> 
  • Когда пользователь, Text обновляется.
  • Когда пользователь вводит и ComboBox находит совпадение в Items, SelectedItem изменен.
  • Когда пользователь вводит код, ComboBox не находит совпадение, и элемент был выбран ранее, SelectedItem установлен в null.
  • Когда пользователь выбирает элемент, обновляются как SelectedItem, так и Text.
  • Когда пользователь покидает ComboBox (потеря фокуса), запускается Command.
  • Когда пользователь набрал текст и открывает раскрывающийся список, запускается Command.
  • EDIT: Как ни странно Command также срабатывает, когда он получает фокус.

Это поведение, которое вы хотите?

+0

Я никогда не рассматривал попытку привязать как текст, так и выбранный элемент. Это может просто работать !! – Asheh

+1

спасибо. Бритва Оккама. Всегда. – Asheh

+1

Как говорит Хантун, вы должны быть осторожны с событием LostFocus с ComboBox в режиме редактирования. Когда ComboBox изначально получает фокус, он фокусируется на текстовом поле внутри, в результате чего ComboBox создает событие LostFocus. Вы можете взломать вокруг этого путем добавления триггера LostFocus непосредственно в текстовом поле в ComboBox в 'вар текстового поля = (TextBox) comboBox.Template.FindName ("PART_EditableTextBox", поле со списком); textbox.LostFocus + = (отправитель, args) => viewModel.Command.Execute(); ' – ptsoccer

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