如果在表单中某些文本框上的验证返回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/

10-11 06:04