首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接口IDataErrorInfo不工作

接口IDataErrorInfo不工作
EN

Stack Overflow用户
提问于 2016-01-28 11:24:57
回答 1查看 209关注 0票数 2

我在下面的类中实现了IDataErrorInfo接口,但它不起作用,即它不执行验证。代码看起来很完美。我不知道为什么。我设置了一个断点,它甚至没有进入IDataErrorInfo Members区域。

产品类

代码语言:javascript
复制
[DataContract()]
public class Product : IDataErrorInfo
{
    [DataMember()]
    public string Name{get;set;}
    [DataMember()]
    public string Code{get;set;}

    #region IDataErrorInfo Members

    public string Error
    {
        get
        {
            return null;
        }
    }

    public string this[string property]
    {
        get
        {
            switch (property)
            {
                case "Name":
                    if (string.IsNullOrEmpty(Name))
                        return "Name is required";
                    break;
                case "Code":
                    if (string.IsNullOrEmpty(Code))
                        return "Code is required";
                    break;
                default:
                    break;
            }
            return null;
        }
    }

    #endregion

    public Product(string name, string code)
    {
        Name = name;
        Code = code;
    }
 }

用于绑定textbox的XAML

代码语言:javascript
复制
<TextBox Grid.Column="1" 
                         HorizontalAlignment="Left" 
                         Height="23" 
                         Margin="24,9,0,0" 
                         TextWrapping="Wrap" 
                         VerticalAlignment="Top" 
                         Width="148" x:Name="txtName" 
                         Text="{Binding Name,Mode=TwoWay,ValidatesOnDataErrors=True}" 
                         MaxLength="50"/>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-28 13:14:55

您需要使用INotifyPropertyChangedIDataErrorInfo使对象可观察,以便绑定知道属性已经更改,并检查ValidatesOnDataErrors=True时是否有任何错误。

代码语言:javascript
复制
public class Product : IDataErrorInfo, INotifyPropertyChanged {
    string _name;
    [DataMember()]
    public string Name{
        get { return _name; }
        set {
            _name = value;
            NotifyPropertyChanged("Name");
        }
    }

    //...Other code removed for brevity

    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged(string propertyName) {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

您甚至可以将已更改的功能移出基类,以便进行重用,如下所示

代码语言:javascript
复制
public abstract class PropertyChangedBase: INotifyPropertyChanged {

    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged(string propertyName) {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

然后把它当作

代码语言:javascript
复制
public class Product : PropertyChangedBase, IDataErrorInfo {
    //Code removed for brevity
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35060200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档