Wpf 为什么IDataErrorInfo发射了多次?

Wpf 为什么IDataErrorInfo发射了多次?,wpf,silverlight,xaml,windows-phone-7,mvvm,Wpf,Silverlight,Xaml,Windows Phone 7,Mvvm,我遇到了一个问题,IDataErrorInfo多次被解雇 交易类别 public class Transaction : INotifyPropertyChanged, INotifyPropertyChanging, IDataErrorInfo { private Double? _transAmount; [Column(DbType = "decimal(19,4)")] public Double? TransAmount { get { return _transAmou

我遇到了一个问题,
IDataErrorInfo
多次被解雇

交易类别

public class Transaction : INotifyPropertyChanged, INotifyPropertyChanging, IDataErrorInfo
{

private Double? _transAmount;

[Column(DbType = "decimal(19,4)")]
public Double? TransAmount
{
    get { return _transAmount; }
    set
    {
        if (_transAmount != value)
        {
            NotifyPropertyChanging("TransAmount");
            _transAmount = value;
            NotifyPropertyChanged("TransAmount");
        }
    }
}

#region INotifyPropertyChanged Members

public event PropertyChangedEventHandler PropertyChanged;

// Used to notify that a property changed
private void NotifyPropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

#endregion

#region INotifyPropertyChanging Members

public event PropertyChangingEventHandler PropertyChanging;

// Used to notify that a property is about to change
private void NotifyPropertyChanging(string propertyName)
{
    if (PropertyChanging != null)
    {
        PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
    }
}

#endregion

#region Data Validation

public string Error { get { return null; } }

public string this[string property]
{
    get
    {
        switch (property)
        {
            case "TransAmount":
                if (TransAmount != null)
                {
                    double value;
                    bool valid = double.TryParse(TransAmount.ToString(), out value);

                    if (!valid) { return TransAmount.ToString() + " is not a valid number"; }
                    else if (value <= 0) { return "Dollar amount must be greater than $0.00"; }
                }
                return null;
            default:
                return null;
        }
    }
}

#endregion

} 
公共类事务:INotifyPropertyChanged、INotifyPropertyChanged、IDataErrorInfo
{
私家双卡;
[列(DbType=“十进制(19,4)”)]
公共双转载
{
获取{return\u transAmount;}
设置
{
如果(_transAmount!=值)
{
NotifyPropertyChange(“TransAmount”);
_交易量=价值;
NotifyPropertyChanged(“TransAmount”);
}
}
}
#区域INotifyProperty更改成员
公共事件属性更改事件处理程序属性更改;
//用于通知属性已更改
私有void NotifyPropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
#端区
#区域索引属性更改成员
公共事件属性更改EventHandler属性更改;
//用于通知属性即将更改
私有void notifyPropertyChangeg(字符串propertyName)
{
if(PropertyChange!=null)
{
PropertyChange(这是新的PropertyChangingEventArgs(propertyName));
}
}
#端区
#区域数据验证
公共字符串错误{get{return null;}}
公共字符串此[字符串属性]
{
得到
{
交换机(属性)
{
案例“TransAmount”:
if(TransAmount!=null)
{
双重价值;
bool valid=double.TryParse(TransAmount.ToString(),out值);
如果(!valid){return TransAmount.ToString()+“不是有效数字”;}

否则,如果(值则技巧如下

使用DataErrorValidationRule而不是ValidateSondaerRors=True

<TextBox>
    <TextBox.Text>
        <Binding Path="..." UpdateSourceTrigger="LostFocus" NotifyOnValidationError="True">
                <Binding.ValidationRules>
                    <DataErrorValidationRule ValidatesOnTargetUpdated="False"/>
                </Binding.ValidationRules>
            </Binding>
     </TextBox.Text>
</TextBox>


参考这篇文章

它触发多少次都不重要。这会导致什么问题?实际上,WPF验证框架并不能“保证”整个“依赖性”框架只通过一次验证。请尝试改进验证代码,使之快速。@Bryant-这是WP7上的(只是添加了标记),我不确定如何向用户显示错误。为了查看错误,我在上面的文本框中添加了一个事件处理程序,
BindingValidationError
。这将弹出一个消息框,显示IDataErrorInfo返回的错误内容。可能这是一个不正确的实现。@AngelWPF-您能详细说明一下吗?
<TextBox>
    <TextBox.Text>
        <Binding Path="..." UpdateSourceTrigger="LostFocus" NotifyOnValidationError="True">
                <Binding.ValidationRules>
                    <DataErrorValidationRule ValidatesOnTargetUpdated="False"/>
                </Binding.ValidationRules>
            </Binding>
     </TextBox.Text>
</TextBox>