wpf企業應用之數據校驗

  wpf中使用IDataErrorInfo實現數據校驗,綁定實體須要實現了此接口,並在UI綁定表達式中添加ValidatesOnDataErrors=True,這樣數據校驗發生時,wpf會調用該接口中的索引而後返回相應的校驗信息,咱們爲控件添加屬性觸發器來響應校驗。html

  下面結合個人項目中的一部分代碼作一說明,具體效果見 wpf企業級開發中的幾種常見業務場景this

  UI綁定spa

 <TextBox Text="{Binding EditProduct.Num, ValidatesOnExceptions=True,ValidatesOnDataErrors=True,NotifyOnValidationError=True}" Grid.Column="1"/>

  model中的IDataErrorInfo實現設計

public string this[string columnName]
{
   get
   {
      switch (columnName)
      {
         case "Num":
            if (Num.HasNothing())
               return "編號不能爲空";
            if (!OnLogicValidate("Num"))
               return "編號不能重複";
            if (Num.Length > 100)
               return "長度不能超過100個字符";
            break;
      }
      return string.Empty;
   }
}

  爲了將邏輯性的校驗轉移到ViewModel中,我專門在model的基類中設計了一個事件,OnLogicValidate方法將執行這個事件,好比我在ViewModel中這樣使用,這樣比較複雜的邏輯校驗就轉移到VM中了,而model中只保留簡單的長度校驗、類型校驗之類的邏輯。code

 bool EditProduct_PropertyNeedLogicValidate(string propertyName,Object model)
 {
    if (propertyName == "Num" && XDBContext.tb_product.FirstOrDefault(p => p.Num == EditProduct.Num && p.ID != EditProduct.ID) != null)
        return false;
    return true;
 }

  最後在控件模板中加入屬性觸發器用來響應錯誤,注意還須要設置控件的綁定屬性NotifyOnValidationError=Truehtm

 <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate>
        <ControlTemplate.Triggers>
           <Trigger Property="Validation.HasError" Value="true">
              <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.Errors)[0].ErrorContent}"/>
           </Trigger>
        </ControlTemplate.Triggers>
     </ControlTemplate>
   </Setter.Value>
</Setter>
相關文章
相關標籤/搜索