2009-08-06 16 views
1

Silverlight 3では、私はMVVMと、検証エラーが発生した場合にsettersが例外を発生させる検証の原則を使用しています。私が使用してフィールド上のバインディング構文を使用して双方向すなわち: SilverlightでValidationSummaryに閉じるボタンを追加する方法

<TextBox x:Name="TextBoxClientName" Text="{Binding Name,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=true}" Grid.Column="1" Grid.Row="0" Margin="5 5 5 5" /> 

私は注釈を使用してViewModelにでこのプロパティを検証:
[Required(ErrorMessage = "Name is required")] 
public string Name 
{ 
    get 
    { 
     return _client.Name; 
    } 
    set 
    { 
     Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Name", DisplayName="Client Name" }); 
     _client.Name = value; 
    } 
} 

は、私が検証の概要を持っているし、すべてがうまく動作しますが笑、私が探している機能は以下の通りです:

あなたはデータフォームを持っていますが、保存をクリックしたときにのみ検証サマリーが上に表示されるようにします。さらに、そのValidationSummaryに閉じるボタンを実装しますユーザーはenterで続行できます矯正する。

私は視認性を制御する方法やvalidationsummaryを切り替える方法がわかりませんが、私はVisibilityを試しました。以下は、提出のエラーを収集し、私が試したコード、ですが、私はにValidationSummaryにそれらを適用することはできません。

public void Save() 
    { 
     List<ValidationError> errors = new List<ValidationError>(); 

     foreach (UIElement ui in LayoutRoot.Children) 
     { 
      FrameworkElement fe = ui as FrameworkElement; 

      if (fe != null) 
      { 
       foreach (ValidationError ve in Validation.GetErrors(fe)) 
       { 
        errors.Add(ve); 
       } 
      } 
     } 


     if (errors.Count > 0) 
     { 

      Validation1.DataContext = errors; 
      Validation1.Filter = ValidationSummaryFilters.All; 
     } 
     else 
     { 
      if (Saved != null) 
       Saved(this, EventArgs.Empty); 
     } 

    } 

乾杯、

アンドリュー

答えて

1

私は推測している今、あなた」であなたのアプリでSIlverlight 4を使用してください。 だから、この答えは、新しいインターフェースが3つの方法でINotifyDataErrorを添加し、Silverlightの4でSilverlightの4のために

です:

public interface INotifyDataErrorInfo 
{ 
    // Returns True if the object has at least one property-level or top-level error. 
    bool HasErrors { get; } 

    // Returns the current set of property-level errors for the provided property name, or 
    // the current top-level errors if the argument is null or empty. 
    IEnumerable GetErrors(string propertyName); 

    // Raised when the set of errors for a particular property has changed, or when the 
    // top-level errors have changed. 
    event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged; 
} 

そのインターフェイスおよびその使用方法に関するウェブ周りの広大なドキュメントがあります。

不要な場合は、DataAnotationsを使用する必要はありません。しかし、もしあなたがそうしたとしても、System.ComponentModel.DataAnnotations名前空間のValidatorクラスを使って検証エラーを得ることができます。

あなたのViewModelにINotifyDataErrorを実装し、(ViewModelで)bool IsValidatingなどのプロパティを設定している場合は、次に、プロパティが変更されるたびに、検証するすべてのプロパティのErrorsChangedイベントが発生します(リフレクションを使用してプロパティ名を取得できます)。以上です。

今度はIsValidating = falseにしてください。保存が要求されたら、IsValidating = trueでエラーを表示してください。

他のあなたができること(これはSilverlight 3のに働くだろうが)IsValidatingプロパティ(IValueConverterを使用して)へのValidationSummaryの可視性を結合し、その後のViewModelからこれを制御しています。

関連する問題