Как написать класс commom для двух классов ViewModel? - PullRequest
0 голосов
/ 16 июня 2011

У меня есть два класса viewmodel, которые называются ChangePwdViewModel.cs и ExpiringPwdViewModel.cs. 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. Но как я могу обновить свойство сообщения моделей представления из этого класса?

Ответы [ 3 ]

3 голосов
/ 16 июня 2011

Как насчет помещения его в базовый класс:

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
{
}

Обновление

Если вы не можете использовать базовый класс, потому что ваши модели представлений уже имеют базовый класс, тогда вы можете использовать интерфейс, как это предлагают другие. Однако это означает, что вам все равно придется реализовывать интерфейс во всех ваших классах моделей представлений, поэтому вы не получите слишком много в плане избежания нескольких реализаций (за исключением того, что у вас есть контракт на ваши модели представлений, что обычно является хорошей вещью). иметь).

Вы можете добиться своего рода «множественного наследования» в C # с помощью инструмента, подобного Dynamic Proxy , который позволяет создавать миксины. Таким образом, вы можете реализовать свойство Message и проверку пароля в одном классе, а затем создать смешанный прокси, который объединит модель представления с этой реализацией. Это не так хорошо, как вам придется создавать все ваши экземпляры модели представлений через прокси-генератор, но это может быть сделано для работы. Посмотрите этот учебник , если он вам подходит.

1 голос
/ 16 июня 2011

Я бы предложил избегать базовых классов (которые могли бы вызвать потенциальные проблемы проектирования в будущем), в таких случаях я бы предпочел пропустить через конструктор алгоритм проверки, что-то вроде этого:

public class MyViewModel
{
    public MyViewModel(Func<bool> validationAlgorithm)
    {
        // ... save function to use later for a validation
    }
}
1 голос
/ 16 июня 2011

Можно сделать так, чтобы два класса ViewModel реализовали общий интерфейс, скажем, IMessage, который реализовал единственное свойство - Message.

Тогда ваш общий класс или функция будет принимать параметр типа IMessage, который он может использовать для обновления сообщения.

...