WPF - 启用按钮如何使用验证规则检查RadioButton

时间:2016-09-10 03:22:50

标签: c# wpf validation button radio-button

我刚刚开始学习WPF,对于任何愚蠢的问题提前抱歉。如果所有输入都没有验证错误,我想启用一个按钮。这是我的示例输入窗口:

<StackPanel>

    ...rest of my page

    <Label>Age:</Label>
    <TextBox>
        <TextBox.Text>
            <Binding Path="Age" UpdateSourceTrigger="PropertyChanged"/>
                <Binding.ValidationRules>
                    <ExceptionValidationRule />
                </Binding.ValidationRules
            </Binding>
        </TextBox.Text>
    </TextBox>
    <Label>Options:</Label>
    <RadioButton>Option one</RadioButton>
    <RadioButton>Option two</RadioButton>
    <Button Name="btnOK" MinWidth="40" Command="c:CustomCommands.Enter">Ok</Button>
</StackPanel>

在我的后面代码中,我将Button的CanExecute方法作为:

private void EnterCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = isValid(sender as DependencyObject);
}

private bool IsValid(DependencyObject obj)
{
    return !Validation.GetHasError(obj) && LogicalTreeHelper.GetChildren(obj).OfType<DependencyObject>().All(IsValid);
}

我在google上看到人们只在一个RadioButton中添加验证规则,就像Validation Rule for Radio buttons wpf一样。

我需要的是当取消选择所有RadioButton时,它应该添加一个Validation Error,这样就可以通过IsValid方法禁用Button。如果选择任何RadioButton,如果Age也是“ok”,则启用Button。

另外,我需要知道它在RadioButton部分的模型视图类中会是怎样的。

谢谢!

1 个答案:

答案 0 :(得分:0)

根据Stígandr在本主题中的回答(Bind IsEnabled property to Boolean in WPF),您只需在viewModel中创建一个属性,并将Radiobutton IsEnabled / IsChecked属性绑定到此属性。

您可以在方法中设置该属性。

private bool IsValid(DependencyObject obj)
{
    return !Validation.GetHasError(obj) && LogicalTreeHelper.GetChildren(obj).OfType<DependencyObject>().All(IsValid);
    yourProperty = value;
}

然后它将更新您的用户界面。

在你的情况下,

在viewModel中创建一个绑定到yourProperty的依赖项属性。

private static readonly DependencyProperty IsFormValidProperty =
    DependencyProperty.Register(
        "IsFormValid",
        typeof(bool),
        typeof(YourControl),
        new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnValidationChanged))
        );

privatestaticvoid OnValidationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
    // here , if e.newValue is true then
    //you can set button's IsEnabled property to true.
}