如何在带有WCF后端的WPF中正确使用.NET数据注释进行数据验证

本文关键字:数据 NET 注释 验证 WCF WPF 后端 | 更新日期: 2023-09-27 18:30:06

问题标题基本上解释了我要做什么。

简化我的代码,例如:

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

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

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

我已经尝试过实现IDataErrorInfo接口,但我似乎无法在其中激发任何东西。我在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;
    }

如何在带有WCF后端的WPF中正确使用.NET数据注释进行数据验证

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

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

public class Restaurant : IDataErrorInfo
{...}

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

您可以在这里看到一个示例