Я не могу воспроизвести это поведение. Я пытался использовать EventToCommand и поведение (которое просто слушает событие TextChanged).
Не подозревая код, я подозреваю, что это может быть связано с тем, как вы получаете текст поля поиска или с логической ошибкой в другом месте.
Это фрагмент того, как я использую EventToCommand:
<TextBox Name="SearchTextBox">
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<cmd:EventToCommand Command="{Binding TestTextChangedCommand,Mode=OneWay}" CommandParameter="{Binding Path=Text, ElementName=SearchTextBox}"/>
</i:EventTrigger>
<i:Interaction.Triggers>
</TextBox>
В виде модели
m_TestTextChangedCommand = new RelayCommand<string>(val => System.Diagnostics.Debug.WriteLine(val));
Как видите, я использовал параметр команды, чтобы передать значение текстового поля в модель представления. Таким образом, модели представления не нужно знать о текстовом поле, чтобы получить текстовое значение.
Альтернативой этому подходу может быть использование поведений и привязки TwoWay для обновления свойства:
<TextBox Name="SearchTextBox" Text="{Binding TextInViewModel, Mode=TwoWay}" >
<i:Interaction.Behaviors>
<sc:UpdateOnTextChangedBehavior/>
</i:Interaction.Behaviors>
</TextBox>
UpdateOnTextChangedBehavior class:
public class UpdateOnTextChangedBehavior : Behavior<TextBox>
{
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.TextChanged +=
new TextChangedEventHandler(AssociatedObject_TextChanged);
}
void AssociatedObject_TextChanged(object sender, TextChangedEventArgs e)
{
System.Diagnostics.Debug.WriteLine(((TextBox)sender).Text);
BindingExpression binding =
this.AssociatedObject.GetBindingExpression(TextBox.TextProperty);
if (binding != null)
{
binding.UpdateSource();
}
}
protected override void OnDetaching()
{
base.OnDetaching();
this.AssociatedObject.TextChanged -=
new TextChangedEventHandler(AssociatedObject_TextChanged);
}
}
То, что сделано выше, имитирует поведение рабочего стола WPF Binding
с UpdateSourceTrigger=PropertyChanged
, которого нет в Silverlight. Так что произойдет, когда вы введете в текстовое поле, свойство TextInViewModel
будет обновлено. Это свойство не обязательно должно быть DependencyProperty
, оно может быть просто обычным свойством CLR.