2010-08-16 69 views
2

Hai all, 我正在做一個使用MVVM模型的項目,任何人都可以通過說我如何驗證我在這個模型中的字段來幫助我。驗證的意思是,如果一個文本字段的名稱(示例)是沒有被用戶添加,那麼一條消息就會被顯示出來,使用彈出窗口或任何東西.Nolramlly我們通過編寫一個函數來完成這個任務,並且這個函數會在保存之前被調用,或者在這個時候如果任何的Mandetory字段是免費的,那麼只會在填充該字段後纔會顯示錯誤,我們可以繼續。如何在MVVM模型中執行此操作?在MVVM模型驗證

回答

0

好吧我不是100%確定你要去哪裏,但我會舉一個例子。不知道這將如何與MVVM一起工作,但我想它應該。當你打電話給你的IsValid方法,它會檢查每個屬性

public class RuleViolation 
{ 
    public string ErrorMessage { get; private set; } 
    public string PropertyName { get; private set; } 

    public RuleViolation(string errorMessage, string propertyName) 
    { 
     ErrorMessage = errorMessage; 
     PropertyName = propertyName; 
    } 
} 

現在:

在模型中添加此:

public bool IsValid 
    { 
     get 
     { 
      return (GetRuleViolations().Count() == 0); 
     } 
    } 

    public override IEnumerable<RuleViolation> GetRuleViolations() 
    { 
     if (string.IsNullOrEmpty(Name)) 
      yield return new RuleViolation("Name can't be empty", "Name"); 

     else if (Name.Length >= 30) 
      yield return new RuleViolation("Name can't be more then 30 letters", "Name"); 

     if (!string.IsNullOrEmpty(Address)) 
     { 
      if (!Web.Contains("http")) 
       yield return new RuleViolation("Address must be bla bal", "Address"); 
     } 

     // and so on 

     yield break; 
    } 

並創建RuleViolation類。如果您正在使用INotifyPropertyChanged,我將添加IsValid作爲屬性,以便在每次更新任何已驗證的屬性時進行更新。如果你有一個基本模型類,你可以有加,並定義了每個派生類的規則:

public bool IsValid 
    { 
     get 
     { 
      return (GetRuleViolations().Count() == 0); 
     } 
    } 

    public abstract IEnumerable<RuleViolation> GetRuleViolations(); 

現在的問題是你如何顯示在您的UI此錯誤。那取決於用戶界面是什麼。我們假設WPF應用程序。然後,你需要你的模型繼承IDataErrorInfo的,你可以使用它像這樣:

#region IDataErrorInfo Members 

    public string Error 
    { 
     get { return null; } 
    } 

    public string this[string name] 
    { 
     get 
     { 
      string result = null; 

      if (this.GetRuleViolations().Where(v => v.PropertyName == name).Count() > 0) 
      { 
       result = this.GetRuleViolations().Where(v => v.PropertyName == name).First().ErrorMessage; 
      } 

      return result; 
     } 
    } 

然後在XAML代碼:

<TextBox Style="{StaticResource ValidationTextBox}" > 
        <TextBox.Text> 
         <Binding Path="Name" UpdateSourceTrigger="PropertyChanged"> 
          <Binding.ValidationRules> 
           <DataErrorValidationRule /> 
          </Binding.ValidationRules> 
         </Binding> 
        </TextBox.Text> 
       </TextBox> 

<Style x:Key="ValidationTextBox" TargetType="TextBox" > 
    <Setter Property="Validation.ErrorTemplate"> 
     <Setter.Value> 
      <ControlTemplate> 
       <Border BorderBrush="Red" BorderThickness="1"> 
        <AdornedElementPlaceholder /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="true"> 
      <Setter Property="ToolTip" 
      Value="{Binding RelativeSource={RelativeSource Self}, 
        Path=(Validation.Errors)[0].ErrorContent}"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

如果您正在使用Asp.net的UI也有一些在建方法也顯示在那裏的形式的錯誤。

我可能會和有更好的方法,但我希望這有些幫助。

+0

非常感謝您的回覆,無論如何,我會盡力實現這一點。 – user421678 2010-08-16 12:25:34

+0

那麼你使用的是什麼UI實現? – 2010-08-16 12:39:37