我是 WPF 的新手,但已经花时间研究 WPF 验证,还没有看到条件验证的好方法。
为了大大简化情况,假设我有两个文本框和一个提交按钮。用户在第一个文本框中输入一个字符串。如果用户输入,例如“ABC”,那么第二个文本框应该是一个必填字段(我希望背景是浅蓝色,以表示这一点),并且提交按钮应该被禁用,直到该文本框是人口稠密。
如何做到这一点?有没有一种简单的方法可以在运行时添加/删除验证? 'DataAnnotations' (http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx) 似乎是一个不错的起点,但我无法用 [Required] 属性标记字段,因为并不总是需要该字段。基本上,我需要类似 'Required if Field1 = 'ABC' 的东西
谢谢!
最佳答案
我会使用 MVVM 来处理它,这里是一个示例。 在类上实现 IDataError Info,这将实现两个属性 Error 和 this[string columnName] 你可以用你想要的绑定(bind)错误实现第二个属性
public class MainViewModel:ViewModelBase,IDataErrorInfo
{
public string Error
{
}
public string this[string columnName]
{
get
{
string msg=nulll;
switch(columnName)
{
case "MyProperty": //that will be your binding property
//choose your validation logic
if(MyProperty==0||MyProperty==null)
msg="My Property is required";
break;
}
return msg;
}
}
还要在文本框的绑定(bind)中设置 ValidateOnErrors=True。这里的 ColumnName 是已更改且 ValidateOnErrors 设置为 true 的属性的名称。选中此处并设置条件并返回消息,然后将此样式放入资源时,您将在工具提示上看到错误。
<UserControl.Resources>
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true" >
<Setter Property="Foreground" Value="Red"/>
<Setter Property="Background" Value="MistyRose"/>
<Setter Property="BorderBrush" Value="Red"/>
<Setter Property="BorderThickness" Value="1.0"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
这是文本框的示例
<TextBox Text="{Binding UpdateSourceTrigger=PropertyChanged, Mode=TwoWay,
Path=PropertyName,ValidatesOnDataErrors=True}" Name="textBox1">
<Validation.ErrorTemplate>
<ControlTemplate>
</ControlTemplate>
</Validation.ErrorTemplate>
</TextBox>
关于c# - WPF 根据需要以编程方式设置字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7667862/