gpt4 book ai didi

WPF 文本框验证

转载 作者:行者123 更新时间:2023-12-04 00:07:17 25 4
gpt4 key购买 nike

我已将验证连接到绑定(bind)到 TextBox 的模型。容器。首次打开窗口时出现验证错误,因为模型为空,我不想看到验证错误,直到提交窗口或 TextBox 中的文本已经改变或失去焦点。

这里是 TextBox :

<TextBox Text="{Binding 
Path=Firstname,
UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True}"
Width="124"
Height="24"/>

如何做到这一点?

最佳答案

这实际上取决于您对 IDataErrorInfo 的实现。如果您基于错误消息字典,您可以控制何时运行添加到该列表的验证。您通常希望从您的属性 setter 中执行此操作(例如每当您调用 PropertyChange 时),这里调用 CheckValidationState:

    public string this[string columnName]
{
get
{
return ValidateProperty(columnName);
}
}

public Dictionary<string, string> Errors { get; private set; }

protected void SetError(string propertyName, string errorMessage)
{
Debug.Assert(!String.IsNullOrEmpty(propertyName), "propertyName is null or empty.");
if (String.IsNullOrEmpty(propertyName))
return;

if (!String.IsNullOrEmpty(errorMessage))
{
if (Errors.ContainsKey(propertyName))
Errors[propertyName] = errorMessage;
else
Errors.Add(propertyName, errorMessage);
}
else if (Errors.ContainsKey(propertyName))
Errors.Remove(propertyName);

NotifyPropertyChanged("Errors");
NotifyPropertyChanged("Error");
NotifyPropertyChanged("Item[]");
}

protected virtual string ValidateProperty(string propertyName)
{
return Errors.ContainsKey(propertyName) ? Errors[propertyName] : null;
}

protected virtual bool CheckValidationState<T>(string propertyName, T proposedValue)
{
// your validation logic here
}

然后,您还可以包含一个验证所有属性的方法(例如在保存期间):
    protected bool Validate()
{
if (Errors.Count > 0)
return false;

bool result = true;
foreach (PropertyInfo propertyInfo in GetType().GetProperties())
{
if (!CheckValidationState(propertyInfo.Name, propertyInfo.GetValue(this, null)))
result = false;
NotifyPropertyChanged(propertyInfo.Name);
}
return result;
}

更新:

我建议将上述代码放入基础 ViewModel 类中,以便您可以重用它。然后,您可以像这样创建派生类:
public class SampleViewModel : ViewModelBase
{
private string _firstName;

public SampleViewModel()
{
Save = new DelegateCommand<object>(SaveExecuted);
}

public DelegateCommand<object> Save { get; private set; }

public string FirstName
{
get { return _firstName; }
set
{
if (_firstName == value)
return;

CheckValidationState("FirstName", value);

_firstName = value;
NotifyPropertyChanged("FirstName");
}
}

public void SaveExecuted(object obj)
{
bool isValid = Validate();
MessageBox.Show(isValid ? "Saved" : "Validation Error. Save canceled"); // TODO: do something appropriate to your app here
}

protected override bool CheckValidationState<T>(string propertyName, T proposedValue)
{
// your validation logic here
if (propertyName == "FirstName")
{
if (String.IsNullOrEmpty(proposedValue as String))
{
SetError(propertyName, "First Name is required.");
return false;
}
else if (proposedValue.Equals("John"))
{
SetError(propertyName, "\"John\" is not an allowed name.");
return false;
}
else
{
SetError(propertyName, String.Empty); // clear the error
return true;
}
}
return true;
}
}

在这种情况下,我使用 DelegateCommand 来触发保存操作,但它可以是任何进行方法调用来进行保存的东西。此设置允许初始空状态在 UI 中显示为有效,但更改或调用 Save 会更新验证状态。您还可以在实际进行验证的方式中获得更通用和更复杂的方法,因此它不会全部以一种方法结束(这里有一些关于类型的假设),但这被简化以使其更容易开始.

关于WPF 文本框验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2079552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com