MVVM Light e.Handled不保持状态

时间:2016-07-27 12:30:56

标签: c# wpf mvvm

我在我的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不保持下一个事件处理程序的状态?

enter image description here enter image description here

2 个答案:

答案 0 :(得分:1)

为什么你认为它没有拯救它?它只是一个不同的事件,他们不相互沟通。因此,您无法在e.Handled== true活动中获得TextChanged

答案 1 :(得分:1)

您不能将e.Handled = true与不同的事件混在一起,例如您现在正在做的事情。

收听PreviewTextInput事件并设置e.Handled = true以阻止再次触发TextChanged事件。