2011-06-16 52 views
0

我有兩個名爲ChangePwdViewModel.csExpiringPwdViewModel.cs的viewmodel類。 ChangPwd.xaml結合ChangePwdViewModelExpiringPwd.xaml結合ExpiringPwdViewModel如何爲兩個ViewModel類編寫一個通用類?

兩者都有如下屬性。

private string _message; 
public string Message 
{ 
    get { return _message; } 
    set { _message = value; OnPropertyChanged("Message"); } 
} 

在每一類中,有一個名爲ValidatePwd()驗證新密碼的功能。

在這個函數中,Message屬性被更新。例如,

if (IsAlphaNumeric(this.NewPassword) == false || IsAlphaNumeric(this.CfmPassword) == false) 
{ 
    this.Message = "Invalid new password, only characters and numbers are accepted, password must contain at least one character and one number"; 
    this.ResetPasswordFields(); 
    return false; 
} 

我想創建一個公共類來寫這個函數,並由兩個viewmodel使用。但是,如何從這個類更新視圖模型的消息屬性?

回答

3

怎麼樣把它在一個基類:

class ViewModelBase 
{ 
    private string _message; 
    public string Message 
    { 
     get { return _message; } 
     set { _message = value; OnPropertyChanged("Message"); } 
    } 

    public bool VerifyPassword(string newPassword) 
    { 
     .... 
    } 
} 

class ChangePwdViewModel : ViewModelBase 
{ 
} 

class ExpiringPwdViewModel : ViewModelBase 
{ 
} 

更新

如果您不能使用基類,因爲您的視圖模型已經有一個基類,那麼你可以使用其他人建議的界面。然而,這意味着您仍然必須在所有視圖模型類中實現接口,所以在避免多個實現方面您不會獲得太多的收益(除非您有視圖模型的合同,那麼通常是一件好事)具有)。

您可以使用類似Dynamic Proxy的工具在C#中實現某種「多重繼承」,該工具允許您創建mixin。因此,您可以在一個類中實現Message屬性和密碼驗證,然後創建一個將視圖模型與該實現合併的mixin代理。它不如你必須通過代理生成器創建所有視圖模型實例,但它可以工作。看看這個tutorial,如果它聽起來像是你的選擇。

+0

還有其他解決方法嗎?謝謝。 – TNA 2011-06-16 10:05:25

+1

@大衛這是一個非常乾淨的做法,而不是解決方法。 – Christian 2011-06-16 11:20:51

+0

@大衛:我更新我的回答有點 – ChrisWue 2011-06-16 19:36:57

1

您可以讓兩個ViewModel類實現一個通用接口,比如說實現了單個屬性 - 消息的IMessage。

然後,您的公共類或函數將採用可用於更新消息的IMessage類型的參數。

+0

嗨,能你多解釋一下?我仍然不明白。謝謝。 – TNA 2011-06-16 09:36:57

1

我會建議避免基類(可能導致未來潛在的設計問題),在這種情況下,我寧願建議通過構造函數通過驗證的算法,水木清華這樣的:

public class MyViewModel 
{ 
    public MyViewModel(Func<bool> validationAlgorithm) 
    { 
     // ... save function to use later for a validation 
    } 
} 
相關問題