gpt4 book ai didi

WPF 验证和控制文本框样式

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

我已经使用基于属性的验证为 WPF 构建了自己的自定义验证框架。我被困在最后一步,即突出显示文本框。实际上,它确实突出显示了文本框,但所有文本框都依赖于单个属性 HasError。

public class RegistrationViewModel  : ViewModel
{
[NotNullOrEmpty("FirstName should not be null or empty")]
public string FirstName { get; set; }

[NotNullOrEmpty("Middle Name is required!")]
public string MiddleName { get; set; }

[NotNullOrEmpty("LastName should not be null or empty")]
public string LastName { get; set; }

public bool HasError
{
get
{
**return Errors.Count > 0; // THIS IS THE PROBLEM**
}
}

}

这是 XAML 代码:
 <Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">                   

<Style.Triggers>

<DataTrigger Binding="{Binding Path=HasError}" Value="True">
<Setter Property="Background" Value="Red" />
</DataTrigger>

</Style.Triggers>

</Style>

上面代码的问题是它会突出显示所有使用“textBoxStyle”的文本框,即使它们是有效的。这是因为 HasError 不是在单个属性的基础上进行验证,而是作为一个整体进行验证。

有任何想法吗?

更新 1:

ViewModel 包含 Errors 集合:
 public class ViewModel : ContentControl, INotifyPropertyChanged
{
public static DependencyProperty ErrorsProperty;

static ViewModel()
{
ErrorsProperty = DependencyProperty.Register("Errors", typeof(ObservableCollection<BrokenRule>), typeof(ViewModel));
}

public ObservableCollection<BrokenRule> Errors
{
get { return (ObservableCollection<BrokenRule>)GetValue(ErrorsProperty); }
set
{
SetValue(ErrorsProperty,value);
OnPropertyChanged("HasError");
}
}

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}

}

更新 2:

我的验证引擎:
public bool Validate(object viewModel)
{
_brokenRules = new List<BrokenRule>();

// get all the properties

var properties = viewModel.GetType().GetProperties();

foreach(var property in properties)
{
// get the custom attribute

var attribues = property.GetCustomAttributes(typeof (EStudyValidationAttribute), false);

foreach(EStudyValidationAttribute att in attribues)
{
bool isValid = att.IsValid(property.GetValue(viewModel,null));

if(isValid) continue;

// add the broken rule

var brokenRule = new BrokenRule()
{
PropertyName = property.Name,
Message = att.Message
};

_brokenRules.Add(brokenRule);
}

}

var list = _brokenRules.ToObservableCollection();

viewModel.GetType().GetProperty("Errors").SetValue(viewModel,list,null);

return (_brokenRules.Count() == 0);
}

最佳答案

您可以在 ViewModels 中实现 IDataErrorInfo 接口(interface),并在 XAML 中检查附加属性 Validation.HasError 的元素是否存在验证错误;更好,因为它是 .Net 中的标准机制。

<Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">                   

<Style.Triggers>

<DataTrigger Binding="{Binding Path=Validation.HasError}" Value="True">
<Setter Property="Background" Value="Red" />
</DataTrigger>

</Style.Triggers>

</Style>

绑定(bind)到 TextBoxes 中的属性时,需要将绑定(bind) ValidatesOnDataError 属性设置为 true。
<TextBox x:Name="someTextBox" Text="{Binding Path=someProperty, ValidatesOnDataErrors=True}">



public class ViewModel : ContentControl, INotifyPropertyChanged,IDataErrorInfo
{
public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}

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

public string Error
{
get
{
return "";
}
}

}

您甚至可以使用您实现的验证方法,但通过属性检查验证。

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

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