0

ElementHost コントロール (WPF UserControl を含む) と [保存] ボタンを含む WinForms フォームがあります。

WPF UserControl には、いくつかの検証が行われたテキスト ボックスがあります。このようなもの...

<TextBox Name="txtSomething" ToolTip="{Binding ElementName=txtSomething, Path=(Validation.Errors).[0].ErrorContent}">
    <Binding NotifyOnValidationError="True" Path="Something">
        <Binding.ValidationRules>
            <commonWPF:DecimalRangeRule Max="1" Min="0" />
        </Binding.ValidationRules>
    </Binding>
</TextBox>

これはすべてうまくいきます。ただし、フォームが無効な状態にある間は [保存] ボタンを無効にします。

どんな助けでも大歓迎です。

4

2 に答える 2

1

これはあなたを助けるはずだと思います:

<UserControl Validation.Error="Validation_OnError >
<UserControl.CommandBindings>   
    <CommandBinding Command="ApplicationCommands.Save" CanExecute="OnCanExecute" Executed="OnExecute"/> 
</UserControl.CommandBindings> 
...
<Button Command="ApplicationCommands.Save" />
...
</UserControl>

/* put this in usercontrol's code behind */
int _errorCount = 0;
private void Validation_OnError(object sender, ValidationErrorEventArgs e)
{
    switch (e.Action)
    {
        case ValidationErrorEventAction.Added:
            { _errorCount++; break; }
        case ValidationErrorEventAction.Removed:
            { _errorCount--; break; }
    }
}

private void OnCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = _errorCount == 0;
}

次に、ユーザーコントロールに登録されたイベントで変更についてメインフォームに通知できます。

于 2010-04-15T11:11:42.613 に答える
0

さて、私はついに私の問題の解決策を見つけました。

WPF コントロールで、これをLoadedイベントに追加しました。

Validation.AddErrorHandler(this.txtSomething, ValidateControl);

上記の場合ValidateControl、次のように定義されます。

private void ValidateControl(object sender, ValidationErrorEventArgs args)
{
    if (args.Action == ValidationErrorEventAction.Added)
       OnValidated(false);
    else
       OnValidated(true);
}

最後に、イベント引数にブール値Validatedを含むというイベントを追加しました。IsValidその後、このイベントをフォームにフックして、コントロールが有効かどうかを伝えることができました。

より良い方法があれば、私は学ぶことに興味があります。

于 2009-07-08T09:55:14.960 に答える