Silverlight - INotifyDataErrorInfo和复杂属性绑定

5

我有一个实现了INotifyDataErrorInfo的视图模型。我正在将文本框绑定到视图模型属性之一,如下所示:

<TextBox Text="{Binding SelfAppraisal.DesiredGrowth, Mode=TwoWay, ValidatesOnNotifyDataErrors=True,NotifyOnValidationError=True}"  Height="200" 
                         TextWrapping="Wrap"/>

数据绑定可以正常工作,但是当我添加验证错误时,UI没有响应,就像这样:
// validation failed
foreach (var error in vf.Detail.Errors)
{
    AddError(SelfAppraisalPropertyName + "." + error.PropertyName, error.ErrorMessage);
}

在立即窗口中运行GetErrors("SelfAppraisal.DesiredGrowth")后,我可以看到: Count = 1
[0]: "必须至少为500个字符。您输入了4个字符。"
我已确保在添加错误时连接与文本框上的绑定表达式匹配,但UI不像以前使用复杂类型时那样显示消息。
我做错了什么?INotifyDataErrorInfo验证是否支持此操作?
更新
我的视图模型实现了INotifyDataErrorInfo,当添加/删除错误时会引发ErrorsChanged。
protected void RaiseErrorsChanged(string propertyName)
    {
        if (ErrorsChanged != null)
        {
            ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
        }
    }

你是否触发了ErrorsChanged事件? - Jehof
是的,即使在我的视图模型中添加/删除错误时,我也会提出这个问题。 - Ronnie Overby
谢谢点赞的人。如果不必在此对象上包装属性,那将非常棒。 - Ronnie Overby
1个回答

2
< p > TextBox会监视SelfAppraisal对象,以获取错误通知。看起来您正在使用SelfAppraisal属性将错误添加到对象中。请尝试将错误添加到SelfAppraisal对象中:

foreach (var error in vf.Detail.Errors)
{
    SelfAppraisal.AddError(error.PropertyName, error.ErrorMessage);
}

这将在SelfAppraisal属性的实例上引发事件。 TextBox会查找与其绑定的该属性的名称为DesiredGrowth的错误。

也许可以说明一下,TextBox并不会监视具有SelfAppraisal.DesiredGrowth属性名称的根对象中的错误。

更新:充分利用ViewModel模式。 在您的VM上创建一个属性:

public string SelfAppraisalDesiredGrowth
{
    get { return SelfAppraisal != null ? SelfAppraisal.DesiredGrowth : null; }
    set
    {
        if (SelfAppraisal == null)
        {
            return;
        }

        if (SelfAppraisal.DesiredGrowth != value)
        {
            SelfAppraisal.DesiredGrowth = value;
            RaisePropertyChanged("SelfAppraisalDesiredGrowth");
        }
    }
}

绑定到这个属性:

<TextBox Text="{Binding SelfAppraisalDesiredGrowth, Mode=TwoWay, ValidatesOnNotifyDataErrors=True,NotifyOnValidationError=True}"  Height="200" TextWrapping="Wrap"/>

在验证时使用VM属性:

// validation failed
foreach (var error in vf.Detail.Errors)
{
    AddError(SelfAppraisalPropertyName + error.PropertyName, error.ErrorMessage);
}

SelfAppraisal没有实现INotifyDataErrorInfo接口。我能否指示文本框监听视图模型的事件并绑定到属性的属性? - Ronnie Overby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接