C# 如何在具有WCF后端的WPF中正确使用.NET数据批注进行数据验证?

C# 如何在具有WCF后端的WPF中正确使用.NET数据批注进行数据验证?,c#,.net,wpf,wcf,data-annotations,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}$")]

题目很好地解释了我想做什么

简化我的代码,例如:

示例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);
         }
    }
pulic级餐厅
{
//RegEx仅允许最大长度为40的alpha字符
//如果我的正则表达式有点不正确,请原谅
[正则表达式(@“^[a-zA-Z'-'\s]{1,40}$”)
公共字符串名称{get;set;}
}
公营餐厅服务
{
列出餐厅=新建列表();
公共餐厅(字符串名称)
{
餐厅=新餐厅();
餐厅名称=名称;
添加(餐厅);
}
}
示例XAML的位:

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

当我的数据注释被违反时,我如何使我的视图执行某些操作

我在这里和其他地方可以找到的所有示例都不是我想要的,或者都与ASP.NET有关。我对WPF和数据注释了解不够,我对WCF非常熟悉

我已经尝试过实现IDataErrorInfo接口,但似乎无法在其中激发任何东西。我在StackOverflow的另一个问题中发现了这段代码。我在WCF服务的餐厅课程中实现了这一点

    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;
    }
public string此[string columnName]
{
得到
{
如果(columnName==“Name”)
{
返回ValidateProperty(this.Name,columnName);
}
返回null;
}
}
受保护的字符串ValidateProperty(对象值、字符串属性名称)
{
var info=this.GetType().GetProperty(propertyName);
IEnumerable errorInfos=
(来自info.GetCustomAttributes(true.OfType()中的va)
其中!va.IsValid(值)
选择va.FormatErrorMessage(string.Empty)).ToList();
如果(errorInfos.Count()>0)
{
返回errorInfos.FirstOrDefault();
}
返回null;
}

要在XAML中绑定的类必须从INotifyDataErrorInfo或IDataErrorInfo接口继承。据我所知,INotifyDataErrorInfo不存在于WPF(4)中,而仅存在于Silverlight和.NET4.5中

要回答您的问题,您的类必须继承IDataErrorInfo,以使WPF在类中出现错误(任何错误)时做出反应。所以你必须

public class Restaurant : IDataErrorInfo
{...}
执行。可以使用ValidationAttribute对服务器类进行注释,但如果只添加服务引用,则不会进行注释。如果您可以在客户端和服务之间共享DLL,那么只要您的类继承自IDataErrorInfo,您就应该有一个有效的解决方案

你可以看到一个例子