如果在表单中某些文本框上的验证返回true,则尝试更改按钮的IsEnabled属性。因此,如果有错误,则IsEnabled属性应设置为false。
由于某种原因,我无法使其正常工作。仅在调用IsEmailValid属性后才调用IDataErrorInfo实现,因此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();
}
最佳答案
当我理解您的代码提取正确时,我认为问题在于输入无效的电子邮件地址时未通知UI。在ProfileView_PropertyChanged(...)中,检查电子邮件是否有效,如果无效,则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!
}
您还可以根据IsEmailValid()的结果将OnPropertyChanged(...)调用包装到if语句中,但这取决于您。
实际上,您甚至不需要在其中调用IsEmailValid()方法,因为在引发PropertyChanged事件后将立即调用该方法。但是,我不想删除它,因为我不知道这是否会在您的应用程序中引入其他错误。
关于c# - 实现IDataErrorInfo和数据绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2424764/