1

就像这样,我有一个 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 并直接在我的视图模型中拥有属性,那么它可以工作,它会显示工具提示和红色验证框。
如果我在作为视图模型属性的类中实现 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();
        }
    }

然后这是我的视图模型的一部分:

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

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

如果我创建相同的属性 (rack_no) 并在我的视图模型中实现 idataerrorinfo,然后我绑定到它,它可以完美运行。

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

4

1 回答 1

0

放弃了这个想法,而是决定使用下面给出的方法:http: //www.codeproject.com/Articles/15239/Validation-in-Windows-Presentation-Foundationhttp://www.codeproject.com/Articles /97564/WPF-MVVM-应用程序中基于属性的验证

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

于 2012-06-30T15:32:49.833 回答