Начало работы с MVVM с WPF - PullRequest
1 голос
/ 09 мая 2011

Я только что получил несколько вопросов по дизайну / реализации для MVVM с wpf, c #. Я просто пытаюсь разобраться с MVVM и бродил, если кто-то может подтвердить мои идеи, в моем заявлении мне нужен сотрудник, отдел и учрежденная компания. Другими словами, у меня есть модель сотрудника и соответствующий сотрудник ViewModel. Теперь, когда пользователь нажимает «Новый сотрудник», открывается окно, в котором есть 4 вещи, 2 поля со списком, поле с именем сотрудника и кнопка «Отправить». Теперь мое основное внимание сосредоточено на том, как мне управлять 2 полями со списком, один для компании и один для отдела?

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

Итак, мой первый вопрос сводится к тому, что я использовал модели компании и отдела в модели сотрудника или я привязал выпадающие списки к отдельной модели представления для компании или отдела? Если да, то как мне получить информацию о поле со списком, если это сделано вторым способом?

И второе - если вы связываете сетку данных с, скажем, EmployeeListViewModel, если какие-либо изменения происходят в списке в employeeelistviewmodel, автоматически ли обновляется эта сетка данных, или мне нужно вызывать функцию, которая перепроверяет список, или я должен это привязать ??

Любая помощь будет великолепна:)

Спасибо всем

Ответы [ 3 ]

4 голосов
/ 09 мая 2011

Не думайте о модели представления сотрудника как о модели сотрудника.Думайте об этом как о модели взгляда сотрудника.Итак, все, что должно появиться в представлении сотрудника, должно присутствовать в модели представления - и это включает в себя все, что необходимо для заполнения полей со списком в этом представлении - так что будет свойство Companies и свойство Departmentsчто свойства ItemSource этих полей со списком будут привязаны к.

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

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

1 голос
/ 09 мая 2011

По вашему мнению, у которого есть 2 комбинированных списка, вам нужно будет представить коллекцию товаров компании и отдела. Это могут быть только модели, но лучше, если они обернуты внутри модели представления. Я предполагаю, что при выборе компании список отделов будет обновляться. Вы можете посмотреть на решение, которое я предложил для Каскадные комбинированные блоки , которые обновляют дочерний список на основе выбора его родителя

Как минимум, у вас есть список элементов для привязки ComboBox и свойство для выбранного элемента. Я использую ItemListViewModel, чтобы сгруппировать их вместе.

class MyViewModel : INotifyPropertyChanged
{
  public MyViewModel()
  {
    Companies = new ItemListViewModel<string>();
    Departments = new ItemListViewModel<string>();
    ...
 }

  public ItemListViewModel<string> Companies { get; set; }
  public ItemListViewModel<string> Departments { get; set; }
}

В XAML

<ComboBox ItemsSource="{Binding Companies}" />
<ConboBox ItemsSource="{Binding Departments}" />

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

Для вашего второго вопроса, пока ваш ViewModel реализует INotifyPropertyChanged, он будет обновлять элементы управления, с которыми связан объект.

0 голосов
/ 09 мая 2011

Я бы поместил данные о компании и отделе в сотрудника ViewModel. Используя Company в качестве примера, у меня было бы два свойства для него

ObservableCollection<CompanyViewModel> ListOfCompanies;
CompanyViewModel SelectedCompany;

ListOfCompanies связан с источником предметов в выпадающем списке и SelectedCompany привязывается (twoway) к выбранному элементу комбинированного списка. Таким образом, вы можете установить выбранную компанию в viewmodel, и он обновит пользовательский интерфейс, и viewmodel также будет обновляться пользовательским интерфейсом при его изменении.

В зависимости от того, как вы заполняете ListOfCompanies и SelectedCompany, вам может понадобиться CompanyViewModel для реализации следующих интерфейсов.

IComparable<CompanyViewModel>, IEquatable<CompanyViewModel> 

Переплет сделает все остальное.

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

Это стоит моих двух битов.

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