Validation.ErrorTemplate在绑定到object属性时会触发

时间:2012-06-28 19:37:11

标签: c# wpf validation mvvm .net-4.0

所以就像这样,我有一个wpf绑定

<TextBox
        Name="txtRackNo"
        Grid.Column="5"
        Grid.ColumnSpan="7"
        Grid.Row="4"
        Grid.RowSpan="1"
        Style="{StaticResource ResourceKey=styleValidationTextBox}"
        Text="{Binding Path=rack_no, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=LostFocus}">
</TextBox>

如果我实现IDataErrorInfo并直接在我的viewmodel中拥有属性,那么它可以工作,它会显示工具提示和红色验证框。
如果我在一个属于我的viewmodel属性的类中实现IDataErrorInfo,则该样式会创建工具提示,但红色错误框不会显示。我确信我的风格正常,只是如果我改变这一行

Text="{Binding Path=rack_no, Mode=TwoWay, ...}" 

使用我的数据类型“RACK”

Text="{Binding Path=rack.rack_no, Mode=TwoWay, ...}"

private Rack _rack;
public Rack rack
{
    get { return _rack; }
    set
    {
        _rack = value;
        createPropertyObserver();
        base.RaisePropertyChanged("rack");
    }
}

然后它只显示工具提示而不是红色验证错误框。

编辑:这里有更多代码,也许这会帮助别人更好地理解我的问题?

class Rack : ObservableObject, IDataErrorInfo
{
    public String _rack_no;
    public String rack_no
{
         get { return _rack_no; }
    set
    {
    if (value != null)
    {
        _rack_no = value;
        base.RaisePropertyChanged("rack_no");
    }
    }
}

     public String Error
    {
        get { return this[null]; }
    }

    public String this[String propertyName]
    {
        get
        {
            String result = String.Empty;
            propertyName = propertyName ?? String.Empty;
            if (propertyName == String.Empty || propertyName == "dc_name")
            {
                if (String.IsNullOrEmpty(this.dc_name))
                {
                    result += "Datacenter name is mandatory." + Environment.NewLine;
                }
            }

            if (propertyName == String.Empty || propertyName == "rack_no")
            {
                if (String.IsNullOrEmpty(this.rack_no) || this.rack_no.Length > 5)
                {
                    result += "Rack number is mandatory and must be 5 letters or less."
                        + Environment.NewLine;
                }
            }
            Debug.WriteLine(result);
            return result.TrimEnd();
        }
    }

然后这是我的viewmodel的一部分:

              private Rack _rack;
    public Rack rack
    {
        get { return _rack; }
        set
        {
            _rack = value;
            createPropertyObserver();
            base.RaisePropertyChanged("rack");
        }
    }

如果在我看来,我将文本框绑定到rack.rack_no,如果存在验证错误,工具提示将起作用并显示正确的错误消息。但是,它不会更改文本框以使用验证方式。

如果我在我的viewmodel中创建了相同的属性(rack_no)并实现了idataerrorinfo,那么我将绑定到它,它完美无缺。

我只是想知道我在这里做错了什么,就像这不是一个有效的验证绑定?有没有办法让我继续绑定到rack.rack_no类并使用验证?

1 个答案:

答案 0 :(得分:0)

废弃了这个想法,而是决定使用下面给出的方法: http://www.codeproject.com/Articles/15239/Validation-in-Windows-Presentation-Foundationhttp://www.codeproject.com/Articles/97564/Attributes-based-Validation-in-a-WPF-MVVM-Applicat

这将idataerrorinfo与System.ComponentModel.DataAnnotations结合使用;执行验证。我还更改了我的验证样式以手动创建红色框,这似乎解决了使用默认验证样式的问题,同时验证绑定到子对象的数据绑定。