c# - 如何在 WPF 后端正确使用 .NET 数据注释进行数据验证?

标签 c# .net wpf wcf data-annotations

问题标题几乎解释了我正在尝试做的事情。

出于示例目的简化我的代码:

示例 WCF 服务的位:

    pulic class Restaurant
    {
         //RegEx to only allow alpha characters with a max length of 40
         //Pardon if my regex is slightly off
         [RegularExpression(@"^[a-zA-Z''-'\s]{1,40}$")]
         public string Name { get; set; }
    }

    public class RestaurantService
    {
         List<Restaurant> restaurants = new List<Restaurant>();

         public AddRestaurant(string name)
         {
              Restaurant restaurant = new Restaurant();
              restaurant.Name = name;
              restaurants.Add(restaurant);
         }
    }

一些示例 XAML:

    <TextBox name="txt1" Text="{Binding Restaurant.Name, ValidatesOnDataErrors=True}"/>

当我的数据注释被违反时,如何让我的 View 执行某些操作?

我在这里和其他地方可以找到的所有示例要么不是我正在寻找的,要么与 ASP.NET 有关。我对 WPF 和数据注释知之甚少,而且我对 WCF 非常陌生。

我已经尝试实现 IDataErrorInfo 接口(interface),但我似乎无法在其中触发任何东西。我在 StackOverflow 上的另一个不同问题中找到了这段代码。我在 WCF 服务的 Restaurant 类中实现了这个。

    public string this[string columnName]
    {
        get 
        {
            if (columnName == "Name")
            {
                return ValidateProperty(this.Name, columnName);
            }
            return null;
        }
    }

    protected string ValidateProperty(object value, string propertyName)
    {
        var info = this.GetType().GetProperty(propertyName);
        IEnumerable<string> errorInfos =
              (from va in info.GetCustomAttributes(true).OfType<ValidationAttribute>()
               where !va.IsValid(value)
               select va.FormatErrorMessage(string.Empty)).ToList();

        if (errorInfos.Count() > 0)
        {
            return errorInfos.FirstOrDefault<string>();
        }
        return null;
    }

最佳答案

要在 XAML 中绑定(bind)的类必须继承自 INotifyDataErrorInfo 或 IDataErrorInfo 接口(interface)。据我所知,INotifyDataErrorInfo 在 WPF (4) 中不存在,仅在 Silverlight 和 .Net 4.5 中存在。

要回答您的问题 - 您的类必须继承自 IDataErrorInfo 以使 WPF 在您的类中出现错误(任何错误)时使用react。所以你必须有

public class Restaurant : IDataErrorInfo
{...}

已实现。服务器类可以用 ValidationAttribute 注释,但如果您只是添加服务引用,这将不会流动。如果您可以在客户端和服务之间共享 DLL,那么只要您的类继承自 IDataErrorInfo,您就应该有一个可行的解决方案。

你可以看一个例子here

关于c# - 如何在 WPF 后端正确使用 .NET 数据注释进行数据验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10037986/

相关文章:

wpf - 如何在 WPF OpenFileDialog 中禁用正在使用的文件检查?

WPF DataGrid 如何在绑定(bind)到界面时添加空白行

c# - 如果在析构函数中我创建了一个对象的活引用怎么办?

c# - 摆脱 WS 安全 header 中的 Expires 节点 (xml)

C#/WPF : Can I Store more that 1 type in Clipboard?

c# - 在字符 != "_"时获取最后一个字符

c# - 如何在C#中计算波信号的混响时间

c# - C# visual studio 编译器如何处理 struct/NULL 比较?

c# - Bootstrap CSS 不适用于 ASP.net

c# - 增量运算符如何与数组一起使用?