如何检查UserControl是否有效

时间:2011-03-02 00:35:55

标签: .net wpf validation user-controls

我在usercontrol中有一个实现ValidationRule的文本框,它工作正常,现在在我使用此控件的窗口中有一个按钮,我想要在usercontrol中的文本框无效时禁用该按钮

1 个答案:

答案 0 :(得分:0)

这里的技巧是使用Command而不是click事件。命令包含用于确定命令是否有效的逻辑,以及执行命令时要运行的实际代码。

我们创建一个命令,并将按钮绑定到它。如果Command.CanExecute()返回false,该按钮将自动被禁用。使用命令框架有很多好处,但我不会在这里讨论它们。

以下是一个可以帮助您入门的示例。 XAML:

<StackPanel>
    <Button Content="OK" Command="{Binding Path=Cmd}">
    </Button>
    <TextBox Name="textBox1">
        <TextBox.Text>
            <Binding Path="MyVal" UpdateSourceTrigger="PropertyChanged" >
                <Binding.ValidationRules>
                    <local:MyValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
</StackPanel>

UserControl代码隐藏(这可能与您已有的类似,但我已将其包含在内以显示命令的创建方式):

public partial class UserControl1 : UserControl
{
    private MyButtonCommand _cmd;
    public MyButtonCommand Cmd
    {
        get { return _cmd; }
    }

    private string _myVal;
    public string MyVal
    {
        get { return _myVal; }
        set { _myVal = value; }
    }

    public UserControl1()
    {
        InitializeComponent();
        _cmd = new MyButtonCommand(this);
        this.DataContext = this;
    }
}

Command类。此类的目的是使用验证系统确定命令是否有效,并在TextBox.Text更改时刷新它的状态:

public class MyButtonCommand : ICommand
{
    public bool CanExecute(object parameter)
    {
        if (Validation.GetHasError(myUserControl.textBox1))
            return false;
        else
            return true;
    }

    public event EventHandler CanExecuteChanged;
    private UserControl1 myUserControl;

    public MyButtonCommand(UserControl1 myUserControl)
    {
        this.myUserControl = myUserControl;
        myUserControl.textBox1.TextChanged += new TextChangedEventHandler(textBox1_TextChanged);
    }

    void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (CanExecuteChanged != null)
            CanExecuteChanged(this, EventArgs.Empty);
    }

    public void Execute(object parameter)
    {
        MessageBox.Show("hello");
    }
}