модель представление должна быть моделью взаимодействия пользователя для определенной области функциональности
Например, если у вас есть страница списка проектов, и пользователь может делать определенные вещи, как удалить проект, редактировать проект, печатать информацию о проекте то вы должны разработать ViewModel, содержащий данные и действия, связанные с этим интерфейсом:
например модели представления должны содержать:
* A bindable container for the project data (list of projects)
* Actions that handle edit/delete interaction
* An action to handle the print functionality
Фактическая функциональность внутри этих действий не может содержаться в ViewModel (ВМ, возможно, получили инъекционные такие услуги, как услуги печати или в хранилище проекта), но ответственность за выполнение этих действия лежат в виртуальной машине.
Также может потребоваться обернуть каждый элемент данных (проект) в режиме просмотра, чтобы дополнительные свойства/действия, зависящие от взаимодействия, могли быть добавлены - например, свойство «выбрано» (представьте, что пользователь хочет многократно выбрать нагрузку проектов в целях - можно добавить выбранное свойство к ProjectViewModel, который будет обернуть каждый проект, который делает связывание легко)
вы можете в конечном итоге что-то вроде следующего:
public class ProjectOverviewViewModel
{
public IList<ProjectViewModel> Projects { get;set; }
public ProjectViewModel SelectedProject { get;set;}
public void EditSelected()
{
// Code to open edit page for the selected project
}
public void Print()
{
}
}
и ProjectViewModel
с выбираемое имущество
public class ProjectViewModel
{
// Either put the actual data item in here and wrap it:
public Project Project {get;set;}
// Or copy properties onto the viewmodel using automapper or some other mapping framework...
// or manually :(
// e.g. properties mirrored from the entity object:
public int ProjectId { get;set;}
public string ProjectName { get;set;}
// The selected property - now your 'Selected' logic is a function of the view/viewmodel
// not the entity. The entity should only be concerned with data persistence
public bool IsSelected {get;set;}
}
Вы также можете использовать комбинированные модели вместе для создания более сложных видов.Представьте, что у вас есть страница с проектами и страница «пользователи, участвующие в проекте», и вам нужна другая страница, которая показывалась как бок о бок (и разрешала вам щелкнуть проект, который обновил панель пользователей) - это возможно, составив ViewModels (путем создания другого ViewModel, который содержит два ViewModels в качестве свойств и проводов до взаимодействия между ними)
public class ProjectAndUserOverView
{
public ProjectOverviewViewModel ProjectOverview {get;set;}
public ProjectUsersViewModel ProjectUsers {get;set;}
// Code here to listen for property changes in ProjectOverview and if SelectedProject changes
// call ProjectUsersViewModel to refresh the data for the selected user
}
в конечном итоге вы просто моделирования взаимодействия с пользователем, и тем более модульным вы можете сделать это, тем легче его будет заключаться в том, чтобы сделать более удобный для обслуживания код
Есть несколько хороших фреймворков MVVM - мой личный фейс - Caliburn Micro, поскольку он делает это очень простым (он сильно использует conventio ns по умолчанию) и легко попасть.
Спасибо, что на самом деле очистили некоторые запутанные, хорошо сформулированные и простые, также я узнаю ваше имя, ответив на ряд моих других вопросов. Благодаря! p.s Я уже использую caliburn.micro на основе вашего предложения в другом вопросе, и мне это нравится. – Ben
Я мог бы прояснить ситуацию, если кто-то путает насчет свойства 'selected' - 'SelectedProject' в' ProjectOverviewViewModel' будет строкой, на которую пользователь нажал, чтобы они могли нажать кнопку редактирования, а свойство 'Selected' на «ProjectViewModel» будет «селектор строк» в сетке для операций с несколькими выборами (например, поле флажка). Обычно у вас есть один или другой, но не оба, но вы ** можете ** иметь оба (SelectedItem в вашем элементе управления сеткой привязан к 'SelectedProject' и столбцу флажка для каждой строки, связанной с' Selected') – Charleh