在不使用MVVM(WPF)的情况下验证3个字段后禁用按钮

本文关键字:3个 验证 字段 情况下 按钮 MVVM WPF | 更新日期: 2023-09-27 18:29:39

我有一个名为Resolution的类,其属性为Resitem(字符串)、Resdate[日期时间]、Resdetail[字符串]。

我有一个窗口,里面有两个文本框和一个日期选择器。

该程序将xml文件读取到数据集中,并将其转换为Observable Collection,可以将对象添加到数据集和ObservableCollection中,当关闭窗口时,它会将所有内容再次保存到xml文件中。

它还使用IDataErrorInfo来验证文本字段和日期,并在发现错误时(文本框为空或日期为过去)在它们前面显示一个(!)

一切都很好——如果不使用MVVM,我唯一想不出的就是禁用"添加"按钮,直到所有值都被验证为正常,然后:当所有值都正常并添加时,清除字段并将日期选择器重新放在当前日期。

任何帮助都将不胜感激,因为我在StackOverflow上发现的关于这个问题的问题并不完全是我需要的。

如果需要代码片段,请拍摄。

在不使用MVVM(WPF)的情况下验证3个字段后禁用按钮

主窗口xaml

<Window x:Class="WpfApplication2.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow"
            Height="350"
            Width="525">
        <Grid>
            <StackPanel>
                <TextBox Text="{Binding Path=InputData.SomeInput,ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}"></TextBox>
                <Button x:Name="SaveButton"  Command="{Binding Path=SaveCommand}">Start</Button>
            </StackPanel>
        </Grid>
    </Window>

下面是主窗口的代码:

 public partial class MainWindow
    {
        public ICommand SaveCommand { get; set; }
        public MyInputData InputData { get; set; }
        public MainWindow()
        {
            InputData = new MyInputData();
            SaveCommand = new MyCommand(InputData, ExecuteAction);
            InitializeComponent();
            Loaded += (s, a) => { DataContext = this; }; 
        }
        private void ExecuteAction()
        {
            //do save
        }
    }

MyInputData类:

public class MyInputData
        : IDataErrorInfo
    {
        public string SomeInput { get; set; }
        public string this[string columnName]
        {
            get
            {
                string result = null;
                if (columnName == "SomeInput")
                {
                    if (string.IsNullOrEmpty(SomeInput))
                        result = "Please enter a Input Data";
                }
                Error = result;
                return result;
            }
        }
        public string Error { get; private set; }
    }

MyCommand实现:

public class MyCommand 
           : ICommand
    {
        private readonly IDataErrorInfo _dataErrorInfo;
        private readonly Action _action;
        public MyCommand(IDataErrorInfo dataErrorInfo, Action action)
        {
            _dataErrorInfo = dataErrorInfo;
            _action = action;
        }
        #region ICommand Members
        public bool CanExecute(object parameter)
        {
            return string.IsNullOrEmpty(_dataErrorInfo.Error);
        }
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
        public void Execute(object parameter)
        {
            _action.Invoke();
        }
        #endregion
    }

我通常会先向按钮添加一个命令!

然后在命令CanExecute事件处理程序(在代码后面)中,我会检查是否设置了所有内容。。。

在您的情况下,这将检查用于绑定的模型/viewmodels的Error属性的值。

private void Save_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = Model.Error == "";
    }

如果你需要更多的帮助或其他方法,我请你具体说明为什么这种方法没有帮助,或者你实际上试图实现什么。