wpfアプリケーションプロジェクトでmvvm lightを使用しています。イベントを聞くために、MVVM LightライブラリのEventToCommand
を使用しています。MVVM Light e.Handledは状態を保持しません
制御コードは以下のようになります。
<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
は次のイベントハンドラの状態を保持しませんか?
したがって、 'e.Handled'を次のハンドラに渡しませんか? –
@zero_codingはいそうではありません。検証とPropertyChangedイベントは直接接続されていません。 WPFでエラーをチェックし、オブジェクトをバインドしたオブジェクト(この例ではTextBox)に追加します。そして、propertychangedイベントはあなたにいくつかの変更があることを伝えます。 [Validation.Errors添付プロパティ](https://msdn.microsoft.com/en-us/library/system.windows.controls.validation.errors(v = vs.110).aspx)にチェックを入れてください。コントロールのエラーをチェックしてください。 – Shakra
ありがとうございました。 –