Как использовать EventToCommand с редактируемым комбинированным списком для привязки TextBoxBase.TextChanged с помощью команды?
У меня есть редактируемый ComboBox.
<ComboBox IsEditable="True">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command="{Binding CritereChangedCommand, Mode=OneWay}"/>
</i:EventTrigger>
<i:EventTrigger EventName="TextBoxBase.TextChanged">
<cmd:EventToCommand Command="{Binding CritereChangedCommand, Mode=OneWay}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
Я использую GalaSoft.MvvmLight.Command.EventToCommand, чтобы связать событие SelectionChanged.
Я также хотел бы связать событие TextChanged, но это немного сложнее: это событие доступно только через свойство ComboBox TextBoxBase, и я не могу найти правильный способ связать это событие.
Вы можете увидеть одну из моих неудачных попыток: привязка SelectionChanged работает нормально, но привязка TextChanged - нет.
Я также попробовал этот синтаксис:
<ComboBox IsEditable="True">
<TextBoxBase>
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<cmd:EventToCommand Command="{Binding CritereChangedCommand, Mode=OneWay}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBoxBase>
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command="{Binding CritereChangedCommand, Mode=OneWay}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
Но это даже не скомпилируется. Я получаю сообщение об ошибке "Тип, который может быть создан ожидаемый" в теге TextBoxBase.
Любая идея?
2 ответа
Я нашел способ обойти проблему:
Я создаю невидимый TextBox, связанный с ComboBox, и привязываю команду к событию TextChanged TextBox. Это не красиво, но это работает...
<ComboBox Name="CbRubrique" IsEditable="True">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<cmd:EventToCommand Command="{Binding CritereChangedCommand, Mode=OneWay}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
<TextBox Text="{Binding ElementName=CbRubrique, Path=Text, UpdateSourceTrigger=PropertyChanged}" Visibility="Collapsed">
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<cmd:EventToCommand Command="{Binding CritereChangedCommand, Mode=OneWay}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
Я знаю, очень поздний ответ... но я надеюсь, что это поможет кому-то.
Проблема здесь в том, что EventTrigger
класс в Microsoft.Expression.Interactivity.dll
использования reflection
найти событие по значению EventName
собственности, и это не будет работать для прикрепленных событий, таких как TextBoxBase.TextChanged
,
Одним из вариантов, который я использую, является реализация вашего собственного EventTrigger
класс, как описано здесь, и использовать этот вместо EventTrigger (ссылка там CommandAction
реализация сломана, но мне удалось получить его с помощью интернет-архива).
Еще один вариант, который мне не нравится, потому что он не классический MVVM Command
использовать, чтобы связать Text
собственность ComboBox
в собственность в ViewModel
и вызовите команду из кода ViewModel в установщике, например так:
<ComboBox IsEditable="True"
Text="{Binding Text, Mode=TwoWay}" />
И в ViewModel:
private string text;
public string Text
{
get { return text; }
set
{
text = value;
OnPropertyChanged("Text");
if(CritereChangedCommand.CanExecute())
CritereChangedCommand.Execute();//call your command here
}
}