C# 实施IDataErrorInfo&;数据绑定

C# 实施IDataErrorInfo&;数据绑定,c#,wpf,validation,binding,C#,Wpf,Validation,Binding,如果表单中某些文本框的验证返回true,我将尝试更改按钮的IsEnabled属性。因此,如果有错误,IsEnabled属性应该设置为false 由于某种原因,我不能让它工作。IDataErrorInfo实现仅在调用my IsEmailValid属性后调用,因此Validation.GetHasError始终返回false,并且my按钮从未被禁用 有人能帮忙吗 代码: 使用IDataErrorInfo验证文本框 <TextBox Style="{StaticResource textBoxI

如果表单中某些文本框的验证返回true,我将尝试更改按钮的IsEnabled属性。因此,如果有错误,IsEnabled属性应该设置为false

由于某种原因,我不能让它工作。IDataErrorInfo实现仅在调用my IsEmailValid属性后调用,因此Validation.GetHasError始终返回false,并且my按钮从未被禁用

有人能帮忙吗

代码:

使用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>
已启用上的按钮绑定

<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();
            }
更新
公共布尔是有效的
{
得到
{
返回IsEmailValid();
}
}
公共字符串电子邮件
{
得到
{
返回电子邮件;
}
设置
{
_电子邮件=价值;
OnPropertyChanged(“Email”);//在IDataErrorInfo实现之前执行
}
}
私有bool IsEmailValid()
{
对象el=FindName(“txtEmail”);
如果(el!=null)
{
_isEmailValid=Validation.GetHasError((DependencyObject)el);//始终为false??
如果(如果有效)
{
返回false;
}
其他的
返回true;
}
返回true;
}
//PropertyChanged事件处理程序:
void ProfileView\u PropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
IsEmailValid();
}

当我正确理解您的代码摘录时,我认为问题在于当输入无效的电子邮件地址时,用户界面没有得到通知。在ProfileView_PropertyChanged(…)中,检查电子邮件是否有效,如果无效,IsEmailValid()应返回false。然而,对这一结果没有采取任何措施;最重要的是:用户界面不会收到有关IsValid属性更改的通知,因此按钮的IsEnabled状态不会更新。当然,在输入无效电子邮件后,IsValid属性的返回值会更改,但UI不会请求此新值

解决方案应该是在ProfileView_PropertyChanged(…)方法中引发IsValid属性的PropertyChanged事件,如下所示:

void ProfileView_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    IsEmailValid();
    OnPropertyChanged("IsValid"); // <== this one is important!
}
void ProfileView\u PropertyChanged(对象发送方,PropertyChangedEventArgs e)
{
IsEmailValid();
OnPropertyChanged(“IsValid”);//我已经解决了它

使用字典跟踪IDataErrorInfo生成的所有错误,然后在IsEmailValid()中验证电子邮件地址。如果电子邮件有效或无效,则从字典中添加/删除错误!!:)

void ProfileView_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    IsEmailValid();
    OnPropertyChanged("IsValid"); // <== this one is important!
}