3

質問のタイトルは、私がやろうとしていることをほぼ説明しています。

例の目的のための私のコードの単純化:

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

1 に答える 1

1

XAML でバインドされるクラスは、INotifyDataErrorInfo または IDataErrorInfo インターフェイスから継承する必要があります。私の知る限り、INotifyDataErrorInfo は WPF (4) には存在せず、Silverlight と .Net 4.5 にのみ存在します。

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

public class Restaurant : IDataErrorInfo
{...}

実装されました。サーバー クラスには ValidationAttribute でアノテーションを付けることができますが、サービス参照を追加するだけではフローしません。クライアントとサービス間で DLL を共有できる場合、クラスが IDataErrorInfo から継承している限り、機能するソリューションが必要です。

ここで例を見ることができます

于 2012-04-09T06:21:06.957 に答える