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

本文关键字:设置 字段 编程 方式根 WPF | 更新日期: 2023-09-27 18:10:36

我对WPF相当陌生,但花了很多时间研究WPF验证,还没有看到一个好的条件验证方法。

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

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

谢谢!

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

我会使用MVVM来处理它,这里是一个示例。在类上实现IDataError Info这将实现两个属性Error和this[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>

我会在你的ViewModel中处理这个逻辑(假设你正在使用MVVM模式,如果不只是在你的代码中)。

对第一个文本框的TextChanged事件触发一些逻辑,最终设置适当的属性。实际上,我说的是手动编码这个验证。一旦您开始使用像这样更复杂的验证逻辑,您就会开始遇到验证框架/声明性验证的限制。