在不使用MVVM(WPF)的情况下验证3个字段后禁用按钮
本文关键字:3个 验证 字段 情况下 按钮 MVVM WPF | 更新日期: 2023-09-27 18:29:39
我有一个名为Resolution的类,其属性为Resitem(字符串)、Resdate[日期时间]、Resdetail[字符串]。
我有一个窗口,里面有两个文本框和一个日期选择器。
该程序将xml文件读取到数据集中,并将其转换为Observable Collection,可以将对象添加到数据集和ObservableCollection中,当关闭窗口时,它会将所有内容再次保存到xml文件中。
它还使用IDataErrorInfo来验证文本字段和日期,并在发现错误时(文本框为空或日期为过去)在它们前面显示一个(!)
一切都很好——如果不使用MVVM,我唯一想不出的就是禁用"添加"按钮,直到所有值都被验证为正常,然后:当所有值都正常并添加时,清除字段并将日期选择器重新放在当前日期。
任何帮助都将不胜感激,因为我在StackOverflow上发现的关于这个问题的问题并不完全是我需要的。
如果需要代码片段,请拍摄。
主窗口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 == "";
}
如果你需要更多的帮助或其他方法,我请你具体说明为什么这种方法没有帮助,或者你实际上试图实现什么。