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

时间:2011-10-05 21:19:08

标签: c# wpf validation c#-4.0

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

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

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

谢谢!

2 个答案:

答案 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事件触发一些逻辑。基本上我是手动代码验证代码。一旦你开始进入这样更复杂的验证逻辑,你将开始遇到验证框架/声明性验证的限制。