我有两个名为ChangePwdViewModel.cs
和ExpiringPwdViewModel.cs
的viewmodel类。
ChangPwd.xaml
绑定到ChangePwdViewModel
,ExpiringPwd.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属性?
答案 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
}
}