【问题标题】:How to write a commom class for two ViewModel classes?如何为两个 ViewModel 类编写一个公共类?
【发布时间】:2011-09-16 05:06:58
【问题描述】:

我有两个视图模型类,分别称为 ChangePwdViewModel.csExpiringPwdViewModel.csChangPwd.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;
}

我想创建一个通用类来编写这个函数并由两个视图模型使用。但是,如何从此类更新视图模型的消息属性?

【问题讨论】:

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


    【解决方案1】:

    把它放在基类中怎么样:

    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 属性和密码验证,然后创建一个将视图模型与该实现合并的混合代理。它不像您必须通过代理生成器创建所有视图模型实例那样好,但它可以工作。看看这个tutorial,如果这听起来适合你。

    【讨论】:

    • @David 这是一种非常简洁的方法,而不是解决方法。
    • 我是这样用的,ChangePwdViewModel:SubAppView,MessageInterface 然后把函数ValidatePwd()改成ValidatePwd(MessageInterface msgInterface) { //流程验证逻辑。 msgInterface.Message="xxxxxxxxxxx"; } 谢谢你的回答。
    【解决方案2】:

    我建议在这种情况下避免使用基类(将来可能会导致潜在的设计问题),我宁愿建议通过构造函数传递一个验证算法,就像这样:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 嗨,你能解释一下吗?我还是不明白。谢谢。
      猜你喜欢
      • 2014-03-26
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      相关资源
      最近更新 更多