如何为两个ViewModel类编写公共类?

时间:2011-06-16 09:24:41

标签: wpf c#-4.0 wpf-controls binding

我有两个名为ChangePwdViewModel.csExpiringPwdViewModel.cs的viewmodel类。 ChangPwd.xaml绑定到ChangePwdViewModelExpiringPwd.xaml绑定到ExpiringPwdViewModel

两者都具有如下属性。

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使用。但是,如何从此类更新视图模型的Message属性?

3 个答案:

答案 0 :(得分: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#中实现某种“多重继承”,这样可以创建mixins。因此,您可以在一个类中实现Message属性和密码验证,然后创建一个mixin代理,它将视图模型与该实现合并。它不如你必须通过代理生成器创建所有视图模型实例,但它可以使它工作。如果这听起来像是你的一个选项,请看看这个tutorial

答案 1 :(得分:1)

您可以让两个ViewModel类实现一个公共接口,比如实现单个属性的IMessage - Message。

然后你的公共类或函数将采用IMessage类型的参数,它可以用来更新消息。

答案 2 :(得分:1)

我建议在这种情况下避免使用基类(将来可能导致潜在的设计问题),我宁愿建议通过构造函数验证算法,如下所示:

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