【问题标题】:WPF: How can I disable one button if my window has any validation error?WPF:如果我的窗口有任何验证错误,如何禁用一个按钮?
【发布时间】:2015-01-11 12:39:04
【问题描述】:

我在一个窗口中有一些 (>20) 控件,每个控件都绑定到 ViewModel 的一个属性。

ViewModel 实现了IDataErrorInfo,以便进行一些验证,并且效果很好。

现在我在窗口中添加一个类似“提交”的按钮。如果任何控件出现验证错误,我想禁用该按钮。

虽然我可以使用DataTrigger 来做这样的伎俩:

<Button Content="Commit">
    <Button.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=control1, Path=(Validation.HasError)}" Value="True">
                    <Setter Property="Button.IsEnabled" Value="False" />
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=control2, Path=(Validation.HasError)}" Value="True">
                    <Setter Property="Button.IsEnabled" Value="False" />
                </DataTrigger>
                <!-- DataTriggers for control3, 4, 5... -->
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>   

这将是一个很长的 XAML 代码,因为我在这个窗口中有 20 多个控件,所以我想知道有没有更好的解决方案?

【问题讨论】:

    标签: c# wpf validation xaml


    【解决方案1】:

    也许您应该在 ViewModel 中创建一个命令。 像这样的:

    class ViewModel
    {
        public ICommand CommitCommand{ get; private set; }
    
        public ViewModel()
        {
            CommitCommand = new RelayCommand(Commit, CanCommit);
        }
    
        private void Commit(object parameter)
        {
            // button click handler
        }
    
        private bool CanCommit(object parameter)
        {
            // check: view model has errors
        }
    }
    

    实现ICommand接口你可以到这里:Wpf Tutorial

    Xaml 代码:

    <Button Command={Binding CommitCommand}/>
    

    【讨论】:

    • 是的,我已经有一个绑定到按钮的命令,但是如何在CanCommit 方法中检查视图模型的错误?我应该再次检查所有属性吗?
    • 检查 IDataErrorInfo 的项目或“错误”属性。
    • IDataErrorInfo.Error 在 WPF 中似乎没用。
    • IDataErrorInfo.Item 帮不上忙?
    • IDataErrorInfo.Item 工作正常,但我必须再次检查所有属性吗?我的意思是 WPF 绑定已经完成了检查工作,我需要的只是一个可以绑定到提交按钮的“ok/ng”标志。
    猜你喜欢
    • 2016-03-23
    • 2012-08-16
    • 2019-05-30
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多