问题标题几乎解释了我想要做的事情。
出于示例目的简化我的代码:
示例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;
}
答案 0 :(得分:1)
要在XAML中绑定的类必须从INotifyDataErrorInfo或IDataErrorInfo接口继承。据我所知,WPF(4)中不存在INotifyDataErrorInfo,但仅存在于Silverlight和.Net 4.5中。
要回答您的问题 - 您的类必须从IDataErrorInfo继承,以使WPF在您的类中出现错误(任何错误)时做出反应。所以你必须有
public class Restaurant : IDataErrorInfo
{...}
执行。可以使用ValidationAttribute注释服务器类,但如果只是添加服务引用,则不会流动。如果您可以跨客户端和服务共享DLL,那么只要您的类继承自IDataErrorInfo,您就应该有一个可用的解决方案。
您可以看到示例here