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>