为什么IDataErrorInfo会多次触发?

时间:2011-09-26 03:40:07

标签: wpf silverlight xaml windows-phone-7 mvvm

我遇到了IDataErrorInfo多次被解雇的问题。

Transaction Class

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

} 

和xaml

<toolkit:PhoneTextBox Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch"
                        x:Name="txtAmount" Width="Auto" 
                        Text="{Binding TransAmount, Mode=TwoWay, NotifyOnValidationError=True, StringFormat=\{0:c\}, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}"
                        BindingValidationError="txtAmount_BindingValidationError" InputScope="CurrencyAmount"
                        GotFocus="txtAmount_GotFocus"
                        LostFocus="txtAmount_LostFocus">
</toolkit:PhoneTextBox>

我不确定模式,但是验证方法被打了2-3次?为什么呢?

修改1 正在txtAmount_LostFocus事件中设置值TransAmount。

编辑2 添加了WP7标签

1 个答案:

答案 0 :(得分:0)

诀窍如下。

使用DataErrorValidationRule而不是ValidatesOnDataErrors = True。

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

请参阅此文https://social.msdn.microsoft.com/forums/vstudio/en-US/099164f8-72aa-4c59-a7b6-7ccbd56702ce/idataerrorinfo-validation-called-twice