【问题标题】:Disabling a Button after Validaton of 3 fields without using MVVM (WPF)在不使用 MVVM (WPF) 的情况下验证 3 个字段后禁用按钮
【发布时间】:2016-01-09 10:15:01
【问题描述】:

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

我有一个带有 2 个文本框和一个日期选择器的窗口。

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

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

一切正常我唯一不知道如何在不使用 MVVM 的情况下禁用添加按钮,直到所有值都验证正常,然后:当所有值都正常并且我添加它们时,清除字段并再次将日期选择器放在当前日期。

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

如果需要代码sn-ps,拍吧。

【问题讨论】:

  • “没有 MVVM”是什么意思?

标签: c# wpf


【解决方案1】:

MainWindow 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>

MainWindow后面的代码如下:

 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
    }

【讨论】:

    【解决方案2】:

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

    然后在命令 CanExecute 事件处理程序中(在代码后面)我会检查是否一切都设置好了......

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

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

    如果您需要更多帮助或其他方法,我请您说明为什么这种方法没有帮助或您实际上想要完成什么。

    【讨论】:

      猜你喜欢
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-17
      • 2023-03-21
      • 1970-01-01
      • 2018-04-24
      • 2011-08-17
      相关资源
      最近更新 更多