Подтвердить что ты не робот

В MVVM каждый ViewModel связан с одной моделью?

В реализации MVVM каждый ViewModel связан только с одним Model?

Я пытаюсь реализовать шаблон MVVM в проекте, но обнаружил, что иногда View может потребоваться информация из нескольких Models.

Например, для UserProfileView для его UserProfileViewModel может потребоваться информация от UserAccountModel, UserProfileSettingsModel, UserPostsDataModel и т.д.

Однако в большинстве статей, которые я читал о MVVM, ViewModel состоит только из одной модели через Injection Dependency. Таким образом, конструктор принимает только одну модель.

Как работает ViewModel, когда он должен получить информацию из нескольких Models? Или такая ситуация когда-либо возникнет в MVVM?

PS: Я не использую Prism или Unity Framework. Я пытаюсь реализовать аналогичные шаблоны в проекте, над которым я работаю, который не использует Prism или Unity. Вот почему мне нужно точно понять, как работают некоторые из этих вещей.

4b9b3361

Ответ 1

В моем понимании шаблона MVVM единственное практическое требование состоит в том, что View получает все свои данные из свойств ViewModel (возможно, через механизм привязки). ViewModel - это класс, который вы создаете специально для этого представления, и берет на себя ответственность заселения себя по мере необходимости. Вы можете думать об этом как о ActiveRecord для представления.

Таким образом, неважно, что вы делаете внутри ViewModel, чтобы получить данные, которые должны показывать его свойства. Вы можете получить его, запросив некоторые службы, прочитав одну или несколько моделей бизнес-единиц, создав их на месте или все вышеперечисленное. Это совершенно нормально, когда требуется сочетание всех этих вещей, чтобы сделать функциональный вид.

Как и в любом шаблоне представления, целью является просто отделить процесс отображения некоторых данных на экране, от процесса получения этих данных. Таким образом, вы можете протестировать каждую часть процесса отдельно.

Изменить: здесь небольшой, но, надеюсь, полный пример потока зависимостей.

// Model/service layer

public class MyModelA
{
  public string GetSomeData()
  {
    return "Some Data";
  }
}

public class MyModelB
{
  public string GetOtherData()
  {
    return "Other Data";
  }
}

// Presentation layer

public class MyViewModel
{
  readonly MyModelA modelA;
  readonly MyModelB modelB;

  public MyViewModel(MyModelA modelA, MyModelB modelB)
  {
    this.modelA = modelA;
    this.modelB = modelB;
  }

  public string TextBox1Value { get; set; } 

  public string TextBox2Value { get; set; }

  public void Load()
  {
    // These need not necessarily be populated this way. 
    // You could load an entity and have your properties read data directly from it.
    this.TextBox1Value = modelA.GetSomeData();
    this.TextBox2Value = modelB.GetOtherData();
    // raise INotifyPropertyChanged events here
  }
}

public class MyView
{
  readonly MyViewModel vm;

  public MyView(MyViewModel vm)
  {
    this.vm = vm;
    // bind to vm here
  }
}

// Application layer

public class Program
{
  public void Run()
  {
    var mA = new MyModelA();
    var mB = new MyModelB();
    var vm = new MyViewModel(mA, mB);
    var view = new MyView(vm);
    vm.Load();
    // show view here
  }
}

Ответ 2

В модели просмотра можно использовать несколько моделей. Целью модели представления является абстрагирование уровня бизнес-данных (например, модели).

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

Ответ 3

viewmodel содержит "логику представления" - поэтому все, что вы хотите показать на экране, просматривается через viewmodel. если вы хотите отображать данные из разных моделей, то ваша модель просмотра связывается с этим и может привязываться к виду.

Основная цель из mvvm была btw unit test. это означает легкое тестирование логики представления без пользовательского интерфейса.

EDIT: почему вы думаете:

ViewModel имеет только один параметр для представления в своем конструкторе

EDIT2:

существует два основных подхода к работе с mvvm: сначала "View First" - "ViewModel First", вы можете, конечно, смешивать оба и выбирать наилучший для вас подход.

Ответ 4

ViewModel может и во многих случаях использовать несколько моделей. Это само по себе "Модель" вашего взгляда.

Рассмотрим экран профиля, в который пользователь вводит свою личную информацию, включая адрес. Если адрес хранится в таблице "адреса", а остальная часть в таблице "профиль", то ViewModel использует модели профиля и адреса для создания единой ViewModel.

Как jgauffin, упомянутый в его ответе, много раз вы можете использовать пользовательские элементы управления для достижения отношений один к одному, но вы также можете ввести ненужную сложность, попробовав за это 100% времени.

Ответ 5

Я бы удостоверился, что вы понимаете разницу между view, viewmodel и всеми другими классами моделей. ViewModel - это объект модели, который заполняется данными, к которым может привязываться представление. Он существует только для представления данных в представление, что делает объект объекта ViewModel-testable и всю бизнес-логику отделенной от представления. Таким образом, вы можете полностью развивать свою бизнес-логику, не используя само представление, и можете заменить представление просто строением или использованием другого представления и привязки к свойствам объекта ViewModel. Например, если представление заполнено пустыми текстовыми полями, содержимое текстовых полей может быть привязано к различным свойствам модели представления.

Обычно обычно должна быть только одна модель представления. НО, если это слишком сложно, вы можете использовать подварианты связанных объектов, как описано в Связывание с ViewModel.SubClass.Property(суб-свойство)

ViewModel может получить данные, которые он возвращает в представлении из разных источников, бизнес-объектов, баз данных и т.д.

Ответ 6

Обычно существует одна модель ViewModel для каждой модели. Эти ViewModels содержат логику обработки данных модели. С другой стороны, у каждого вида есть собственная модель просмотра. Таким образом, это означает:

class ModelA 
{
    bool TestValue{get;set;}
}
class ViewModelA<ModelA>
{
    ValueViewModel<bool> TestValue{get; private set;}

    public ViewModelA(ModelA model) 
    {
        base.Model = model;
        this.Initialize();
    }
}

class ModelB 
{
    string Username;
}
class ViewModelB<ModelB>
{
    ValueViewModel<string> Username{get; private set;}

    public ViewModelB(ModelB model) 
    {
        base.Model = model;
        this.Initialize();
    }
}

Это ViewModels, которые инкапсулируют модели. Представления имеют свои собственные ViewModels:

public ViewModelForExactlyOneView
{
    public ViewModelA{get;set;}
    public ViewModelB{get;set;}
}

Чтобы ответить на ваш вопрос, ViewModel1 ссылается на ViewModelA и ViewModelB. Поэтому View может получить данные из ViewModel1.ViewModelA.TestValue.

Ответ 7

просто используйте модель User в вашем представлении

public partial class User : Login
{
    public string Password { get; set; }

    public List<Customer> customer { get; set; }
}

в этом еще одна модель, наследуемая, и модель клиента также используется в этой модели.