Как использовать 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
    }
}
Другие вопросы по тегам