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'
谢谢!
我会使用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事件触发一些逻辑,最终设置适当的属性。实际上,我说的是手动编码这个验证。一旦您开始使用像这样更复杂的验证逻辑,您就会开始遇到验证框架/声明性验证的限制。