如果我表单中某些文本框的验证返回true,我正在尝试更改按钮的IsEnabled属性。因此,如果存在错误,则应将IsEnabled属性设置为false。
出于某种原因,我无法让它发挥作用。 IDataErrorInfo实现仅在调用我的IsEmailValid属性后调用,因此Validation.GetHasError始终返回false并且永远不会禁用我的按钮。
有人可以帮忙吗?
代码:
使用IDataErrorInfo验证的文本框
<TextBox Style="{StaticResource textBoxInError}" Name="txtEmail" Grid.Column="1" Grid.Row="2" Width="150" Height="23" HorizontalAlignment="Right" VerticalAlignment="Center">
<TextBox.Text>
<Binding Path="Email" Mode="TwoWay"
ValidatesOnDataErrors="True"
UpdateSourceTrigger="LostFocus"
></Binding>
</TextBox.Text>
</TextBox>
IDataErrorInfo实施:
public string Error
{
get
{
return null;
}
}
public string this[string name]
{
get
{
string result = null;
#region Email
if (name == "Email")
{
if (!presenter.LenientValidateEmail(Email))
{
result = "Your email address is not valid";
}
}
#endregion
#region Website
#endregion
return result;
}
}
IsEnabled上的按钮绑定
<Button Name="btnUpdate" IsEnabled="{Binding IsValid}" HorizontalAlignment="Left" Grid.Column="3" Grid.RowSpan="2" Grid.Row="6" Height="23" Width="75" Click="btnUpdate_Click">Update
</Button>
public bool IsValid
{
get
{
return IsEmailValid();
}
}
public string Email
{
get
{
return _email;
}
set
{
_email = value;
OnPropertyChanged("Email"); // executes before IDataErrorInfo Implementation
}
}
private bool IsEmailValid()
{
object el = FindName("txtEmail");
if (el != null)
{
_isEmailValid = Validation.GetHasError((DependencyObject)el); // always false??
if (_isEmailValid)
{
return false;
}
else
return true;
}
return true;
}
//PropertyChanged event handler:
void ProfileView_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
IsEmailValid();
}
答案 0 :(得分:3)
当我理解您的代码正确提取时,我认为问题是在输入无效的电子邮件地址时不会通知用户界面。在ProfileView_PropertyChanged(...)中,检查eMail是否有效,如果无效,则IsEmailValid()应返回false。但是,这个结果没有做任何事情;最重要的是:UI不会通知IsValid属性的更改,因此,按钮的IsEnabled状态不会更新。当然,输入无效的电子邮件后,IsValid属性的返回值会发生变化,但UI不会请求这个新值。
解决方案应该是在ProfileView_PropertyChanged(...)方法中为IsValid属性引发PropertyChanged事件,如下所示:
void ProfileView_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
IsEmailValid();
OnPropertyChanged("IsValid"); // <== this one is important!
}
你也可以将OnPropertyChanged(...)调用包装成if语句,具体取决于IsEmailValid()的结果,但这取决于你。
实际上,你甚至不需要调用IsEmailValid()方法,因为它会在引发PropertyChanged事件后立即调用。但是,我不想删除它,因为我不知道这是否会在您的应用程序中引入其他错误。
答案 1 :(得分:1)
我已经解决了。
使用字典跟踪IDataErrorInfo生成的所有错误,然后在IsEmailValid()中验证电子邮件地址。如果电子邮件有效或无效,则在字典中添加/删除错误!! :)