Silverlight & MVVM: загрузка данных из веб-службы в виртуальную машину - PullRequest
3 голосов
/ 29 марта 2011

Я пытаюсь настроить viewModel (VM), чтобы он содержал логику для получения данных из веб-службы, а затем загрузил данные в модель, которая затем была бы открыта для просмотра через ViewModel.

ViewModel

public StudentViewModel : INotifyPropertyChanged
{
    private List<Student> _students;
    public List<Student> Student
    {
        get{.....}
        set{.....}
    }

    public StudentViewModel()
    {
        //call webservice and load the data into Students
    }    
}

View

установить контекст данных для viewModel, определенной выше

<UserControl DataContext=..... />

Проблема

Поскольку я звоню в веб-службу из ctor ViewModel, я думаю, что дизайнер VisualStudio бросает вызов.Теперь я мог бы вызвать метод Load на моей виртуальной машине из метода PageLoad представления, но мне было интересно, есть ли лучший способ справиться с этой проблемой?

Причина

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

Ответы [ 3 ]

2 голосов
/ 29 марта 2011

Вы должны добавить проверку к свойству IsInDesignMode класса DesignerProperties в своем конструкторе.

Если IsInDesignMode возвращает false, вы должны загрузить своих студентов из своего веб-сервиса.Если вы находитесь в DesignMode, вы можете создать фиктивные объекты для инициализации модели представления с данными DesignTime.

public class StudentViewModel : INotifyPropertyChanged{

    public StudentViewModel() {
       if (DesignerProperties.IsInDesignMode) {
         // constructor dummy objects or initialize your viewmodel with DesignTime values
       }
       else {
         // initialize viewmodel with data from webservice
       }


    }

    // rest of the class
  }
1 голос
/ 29 марта 2011

Вы можете добавить тест, чтобы сервис не вызывался в режиме разработки :

1 голос
/ 29 марта 2011

Используете ли вы ServiceLocator для создания ViewModels?

Я думаю, что вы можете решить свою проблему с помощью ServiceLocator.Локатор может создать новый объект ViewModel, вызвать (в асинхронном режиме) веб-сервис и вернуть виртуальную машину.Затем в виртуальной машине вы можете иметь код, который будет обрабатывать завершенное событие вызова веб-службы.

Для работы с дизайнерами вы можете иметь в ServiceLocator код, который будет вызывать сервис, только если приложение находится во время выполнения, а не в конструкторе Visual Studio.

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

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