【问题标题】:Interface IDataErrorInfo isn't working接口 IDataErrorInfo 不起作用
【发布时间】:2016-01-28 11:24:57
【问题描述】:

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

产品类别

[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

<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"/>

【问题讨论】:

    标签: c# validation silverlight


    【解决方案1】:

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

    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));
            }
        }
    }
    

    您甚至可以将属性更改的功能移到基类中以便像这样重用

    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));
            }
        }
    }
    

    并像使用它一样

    public class Product : PropertyChangedBase, IDataErrorInfo {
        //Code removed for brevity
    }
    

    【讨论】:

    • 谢谢我让它工作了。除此之外,我还有另一个问题,我在 ASP.NET .Web 项目中创建了一个类,我试图在 MainPage.xaml.cs 类中创建它的一个对象,但似乎不可能?可以指导一下吗?
    • 您为 silverlight only 创建了初始对象/类,Web 项目无法访问该对象/类。如果您尝试在不同项目类型之间共享模型,那么我建议您创建一个共享 PCL (Portable Class Library) 以便您可以从 asp.net.web 项目中引用它。
    • Silverlight Class Library 怎么样?
    • 您想要的手动脏修复是创建一个 bool 属性,例如 IsValid,它包含模型的错误。如果没有错误返回 true,否则返回 false。然后,您可以将该属性绑定到按钮的IsEnabled
    • 更简洁的方法是使用Commanding 模式,使用ICommand 并将按钮绑定到命令属性。查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多