Как загрузить один объект со свойствами дочерней коллекции в моей модели представления? - PullRequest
0 голосов
/ 03 ноября 2011

У меня есть пользовательская форма ввода данных, которая привязана к ViewModel (VM).Предполагается, что в форме ввода данных отображаются поля, в которые пользователь может ввести данные сотрудника, т.е. 1 сотрудник на форму.EmployeeViewModel загружает кучу данных из веб-сервисов, таких как один сотрудник (для обновлений) и множество коллекций.Эти коллекции состоят из «Отделов», например, Сотрудник принадлежит к одному из многих Отделов, «Супервизоров», например, Сотрудник назначен Супервайзеру и так далее.Итак, на конструкторе моей виртуальной машины я извлекаю FetchData () из службы и должен ждать, пока она не будет завершена.

Итак, на OnLoadComplete я назначаю данные, возвращенные Employee, которые являются свойством моей виртуальной машины, итакже загрузите все коллекции, такие как Отделы, для ComboBox.

Другие свойства на виртуальной машине отображают исключения NullException при загрузке b / c, они выглядят так:

private Department_selectedDepartment;
public Department SelectedDepartment
{
   get
      { return this.Employee.Department; }          **// where error occurs**
   set
      {
          _selectedDepartment = value;
          this.Employee.Department = value;
          OnPropertyChanged("SelectedDepartment");
      }
}

В моем XAML у меня есть коллекции и их "Выбранные ..." -части как:

<ComboBox
    ItemsSource="{Binding Departments, Mode=OneWay}"
    SelectedItem="{Binding SelectedDepartment, Mode=TwoWay}" />

Когда получатель SelectedDepartment нажимает при загрузке виртуальной машины, он говорит, что this.Employee "null, поэтому я получаю исключение.

Как другиеделать это, то есть ждать, пока сотрудник загружен?

Ответы [ 4 ]

3 голосов
/ 03 ноября 2011

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

private Department _selectedDepartment;
public Department SelectedDepartment
{
   get
      { return _selectedDepartment; } 
   set
      {
          _selectedDepartment = value;
          OnPropertyChanged("SelectedDepartment");
      }
}

Затем, как только ваш сотрудник закончит загрузку, выберите правильный отдел

SelectedDepartment = Departsments.Where(department=> department.ID == Employee.Department.ID ).First();
2 голосов
/ 03 ноября 2011

Возможно, вы захотите просто заменить

 get
  { return this.Employee.Department; }          **// where error occurs**

на

 get { return Employee == null? null: Employee.Department; }    

(или соответствующий лучший код, как без троичных операторов)

Не очень многосмысл выбирать что-либо в выпадающем списке, когда ничего еще не загружено, и ошибка не в том, что вы привязываете к null, а в том, что вы пытаетесь получить Department по нулевой ссылке.конструктор viewmodel?(если я правильно понимаю) но это выходит за рамки этого вопроса, я думаю.

1 голос
/ 03 ноября 2011

Пожалуйста, попробуйте:

private Department _selectedDepartment;
public Department SelectedDepartment
{
   get
      { return _selectedDepartment;}   //return this.Employee.Department; 
   set
      {
          _selectedDepartment = value;
                                                               //this.Employee.Department = value;
          OnPropertyChanged("SelectedDepartment");
      }
}

, а затем загрузить Employee из службы, а также загрузить все коллекции, например, Departments .... Наконец добавим эти строки для привязки ComboBox:

Departments = new List<Department>(); //feed the collection by service calling result for ComboBox DataSource. 
SelectedDepartment = Employee.Department; //or, SelectedDepartment = Departments[0];

Надеюсь, это сработает.

1 голос
/ 03 ноября 2011

Один из вариантов - использовать «шаблон нулевого объекта» - иметь объект Department, который ничего не представляет.

Таким образом, вы можете заменить

private Department _selectedDepartment;
public Department SelectedDepartment
{
    get { return this.Employee.Department; }

на

private Department _selectedDepartment = new Department { Name = string.Empty };
public Department SelectedDepartment
{
    get { return _selectedDepartment; }

Вам понадобится какой-то метод, который применяет все значения к свойствам при получении данных Employee.

Привязка будет работать сразу, а затем, когда данные будут иметь значение "null"«Отделение можно заменить на соответствующее значение.

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