WPF以编程方式根据需要设置字段

use*_*225 2 c# validation wpf c#-4.0

我是WPF的新手,但花时间研究WPF验证,还没有看到一个好的方法来进行条件验证.

为了大大简化这种情况,假设我有两个文本框和一个提交按钮.用户在第一个文本框中输入一个字符串.如果用户输入,例如"ABC",则第二个文本框应该是必填字段(我希望背景为浅蓝色,以表示这一点),并且应该禁用提交按钮,直到该文本框为填充.

如何才能做到这一点?有没有简单的方法在运行时添加/删除验证?'DataAnnotations'(http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx)似乎是一个很好的起点,但我不能用[Required]属性标记一个字段,因为并不总是需要这个领域.基本上,我需要像'如果Field1 ='ABC'那样的东西

谢谢!

Niv*_*kia 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

还在文本框的绑定中设置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>
Run Code Online (Sandbox Code Playgroud)

这是一个文本框示例

<TextBox Text="{Binding UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, 
 Path=PropertyName,ValidatesOnDataErrors=True}" Name="textBox1">
  <Validation.ErrorTemplate>
        <ControlTemplate>
          </ControlTemplate>
   </Validation.ErrorTemplate>

 </TextBox>
Run Code Online (Sandbox Code Playgroud)