2012-04-06 10 views
3

質問タイトル私は何をしようとしているかをほとんど説明します。WCFバックエンドを使用してWPFでデータ検証に.NETデータ注釈を正しく使用するにはどうすればよいですか?

例のビットWCFサービス:例のXAMLの

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

ビット:例の目的のために私のコードの

簡素化

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

答えて

1

XAMLに拘束されることにあるクラスはINotifyDataErrorInfoまたはIDataErrorInfoインターフェイスから継承しなければなりません。私の知る限り、INotifyDataErrorInfoはWPF(4)ではなく、Silverlightと.Net 4.5にのみ存在します。

あなたの質問に答えるには、あなたのクラスはIDataErrorInfoから継承して、クラス内にエラー(エラー)がある場所でWPFを反応させる必要があります。だからあなたは持っている必要があります

public class Restaurant : IDataErrorInfo 
{...} 

実装されています。 ValidationAttributeを使用してサーバークラスに注釈を付けることはできますが、単にサービス参照を追加するだけでは流れません。クライアントとサービスの間でDLLを共有できる場合は、クラスがIDataErrorInfoから継承している限り、実用的な解決策が必要です。

例が表示されますhere

関連する問題