2010-11-07 61 views
7

我正在使用MVVM模式的WPF,並剛啓動一個非常大的項目。如何使用WPF ViewModel中的模型驗證規則

爲了保持關注點分離,我想將所有的驗證規則放入我的數據模型中。

但是當我回顧如何進行WPF驗證時,我可以找到的所有示例都顯示瞭如何使用包含驗證規則的ViewModel執行此操作。其中的一些例子顯示了對WPF的深刻理解,並且非常酷。

在這個特定的應用程序中,我在編輯和模型的ViewModels之間建立了1:1的映射關係,所以我可以將它放在ViewModels中。但它感覺不對。

回答

3

使用IDataErrorInfo進行驗證(如果這是您正在使用的)將在View上綁定的對象上發生。

所以如果你有

<TextBox Text="{Binding Name}" /> 

這將在視圖模型。但是,如果您將模型作爲視圖模型的屬性公開,那麼將在數據模型上進行驗證。

<TextBox Text="{Binding Model.Name}" /> 

選擇第一項,可以綁定到視圖模型屬性和路由數據模型,其中包含的實際驗證,那麼就執行IDataErrorInfo的視圖模型和航線驗證的模型

視圖模型:

public string this[string propname] 
{ 
    get { return _model[propname]; } 
} 

只有當你實際設置在模型驗證所需的屬性工作

這是非常有用

視圖模型:

public string SomeProperty 
{ 
    get { reutrn _model.SomeProperty; } 
    set { 
      _model.OtherProperty = value; 
      RaisePropertyChanged("SomeProperty"); 
     } 
} 

不過我更喜歡具有因這個問題的第二個綁定選項是不是很乾燥,所以我幾乎總是暴露數據模型作爲視圖模型的屬性(因爲這是負責數據),並讓ViewModel管理視圖的模型,這更多關於UI如何與數據交互。

在非常複雜的情況下,將驗證從模型和視圖模型中分離出來並讓視圖模型和數據模型都消耗它可能會更好。