0

我有一个 WinForms 表单,其中包含一个 ElementHost 控件(其中包含一个 WPF 用户控件)和一个保存按钮。

在 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 回答