我在我的wpf应用程序项目中使用mvvm light。为了收听事件,我正在使用MVVM Light库中的EventToCommand
。
控制代码如下所示:
<TextBox x:Name="Scannerport"
Grid.Row="1"
Grid.Column="1"
Margin="15,10,40,10"
MinWidth="100"
FontSize="40"
MaxLength="2"
PreviewTextInput="Scaleport_OnPreviewTextInput"
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
Text="{Binding ScannerPort, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=True, NotifyOnValidationError=True}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<cmd:EventToCommand Command="{Binding OnTextChanged}"
PassEventArgsToCommand="True" />
</i:EventTrigger>
<rt:RoutedEventTrigger RoutedEvent="{x:Static Validation.ErrorEvent}">
<cmd:EventToCommand Command="{Binding OnValidationError}" PassEventArgsToCommand="True" />
</rt:RoutedEventTrigger>
</i:Interaction.Triggers>
</TextBox>
在ViewModel中实现的代码:
private void _OnTextChanged(TextChangedEventArgs e)
{
Debug.WriteLine(e.Handled);
if (ScalePort != 0 && ScannerPort != 0)
{
Disable = true;
return;
}
Disable = false;
}
private void _OnValidationError(ValidationErrorEventArgs e)
{
if (e.Action == ValidationErrorEventAction.Added)
{
Disable = true;
e.Handled = true;
}
}
正如您在第二种方法中看到的那样,我设置了e.Handled = true
,然后在调试期间,第一种方法e.Handled
仍然是false
?
为什么e.Handled
不保持下一个事件处理程序的状态?
答案 0 :(得分:1)
为什么你认为它没有拯救它?它只是一个不同的事件,他们不相互沟通。因此,您无法在e.Handled== true
活动中获得TextChanged
。
答案 1 :(得分:1)
您不能将e.Handled = true
与不同的事件混在一起,例如您现在正在做的事情。
收听PreviewTextInput
事件并设置e.Handled = true
以阻止再次触发TextChanged
事件。