我是WPF的新手,但花时间研究WPF验证,还没有看到一个好的方法来进行条件验证。
为了大大简化这种情况,假设我有两个文本框和一个提交按钮。用户在第一个文本框中输入一个字符串。如果用户输入,例如“ABC”,则第二个文本框应该是必填字段(我希望背景为浅蓝色,表示这一点),并且应该禁用提交按钮,直到该文本框为填充。
如何做到这一点?有没有简单的方法在运行时添加/删除验证? 'DataAnnotations'(http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx)似乎是一个很好的起点,但是我不能用[Required]属性标记一个字段,因为并不总是需要这个领域。基本上,我需要类似'如果Field1 ='ABC'需要的东西
谢谢!
答案 0 :(得分:7)
我会使用MVVM处理它,这是一个示例。 在类上实现IDataError Info并实现两个属性Error和这个[string columnName]你可以用你想要的绑定错误实现第二个属性
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;
}
}
在文本框的绑定中也设置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>
答案 1 :(得分:1)
我只是在你的ViewModel中处理这个逻辑(假设你正在使用MVVM模式,如果不是在你的代码隐藏中)。
为最终设置相应属性的第一个文本框的TextChanged事件触发一些逻辑。基本上我是手动代码验证代码。一旦你开始进入这样更复杂的验证逻辑,你将开始遇到验证框架/声明性验证的限制。