Нет производных ViewModels, но такое же поведение? - PullRequest
0 голосов
/ 29 мая 2018

Я пишу небольшое настольное приложение wpf.Моя BaseViewModel выглядит так:

public abstract class BaseViewModel : INotifyPropertyChanged, IComparable<BaseViewModel>
{
    public abstract string GetDisplayText();
    public abstract string GetImageName();

    // INotifyPropertyChanged
}

Я искал лучший paxis для mvvm.Большинство говорят, что существует несколько ViewModel для одной модели, и я согласен с этим.

Поскольку я хочу, чтобы все ViewModel одного типа обрабатывали основы одинаково, я думаю,они должны быть получены друг от друга.

public abstract class BaseCustomerVm : BaseViewModel
{
    public abstract string Name { get; set; }
    public abstract int Number { get; set; }
    public abstract bool IsPerson { get; set; }

    public override string GetDisplayText()
    {
        return Name;
    }

    public override string GetImageName()
    {
        if (IsPerson)
            return "Person";
        else
            return "Company";
    }
}

public class Customer1Vm : BaseCustomerVm
{
    public override string Name { get; set; }
    public override int Number { get; set; }
    public override bool IsPerson { get; set; }
}

Для реализации этого у меня есть следующие опции:

Версия 1:

public class Customer2Vm : BaseCustomerVm
{
    public override string Name { get; set; }
    public override int Number { get; set; }
    public override bool IsPerson { get; set; }
    // Further Properties
}

Версия 2:

public class Customer2Vm : Customer1Vm
{
    // Further Properties
}

В моем поиске я читал, что ViewModels не должны происходить друг от друга.На это также ответили в этом посте .Мои вопросы:

  1. Почему бы мне не выводить таким образом?
  2. Каким будет правильный способ обработки таких основ основ без наследования?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

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

Поскольку вы не можете наследовать от более чем одного класса в C #, вам нужно разбить общую функциональность на повторно используемые компоненты, которые вы можете внедрить в свои модели представлений.

Но это единственныйВы можете напрямую связать некоторые общие свойства, которые определены в классе, - использовать наследование, и нет ничего плохого в том, чтобы наследовать от цепочки различных классов моделей базового представления.На самом деле, это довольно распространенный подход в моем опыте.Большинство типов, используемых в представлении (Control, FrameworkElement и т. Д.), Также делают это.

0 голосов
/ 29 мая 2018

Насколько Customer2Vm должно быть производным от Customer1Vm;Я думаю, что вам нужен классический вопрос о наследовании:

Имеет ли Customer2Vm отношения "есть-ли" с Customer1Vm?

Только вы знаете;но по именам я бы сомневался в этом.Мне кажется, что они оба должны быть производными от BaseCustomerVm.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...