powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Помогите с Prism'ой
15 сообщений из 15, страница 1 из 1
Помогите с Prism'ой
    #36967237
Nick_K_121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может я тривиальные вещи буду спрашивать - не пинайте - я только начинаю изучать SL, Prism и т.д.

Примеры посмотрел...
Стал пробовать сделать свое и сразу уперся в получение данных....

В примерах они везде создаются а-ля
Код: plaintext
new List() { new Item() {Id = 1}, new Item() {Id = 2} }
а в "жизни" как это должено быть реализовано???

Если данные я получаю например с сервера ввиде XML по Http?
Использую WebClient добавляя обработчик
Код: plaintext
1.
2.
  WebClient wc = new WebClient();
  wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
  wc.OpenReadAsync(_uri);
(это вообще все в отдельной библиотеке, которая загружает данные, что-то там с ними делает ну и т.д., не важно)

Вот есть в Prism 4 пример UIComposition:
там во ViewModel список служащих получаем так:

Код: plaintext
this.Employees = new PagedCollectionView(dataService.GetEmployees());

GetEmployees их возвращает как описано выше...
(
Код: plaintext
new List() { new Item() {Id = 1}, new Item() {Id = 2} }
)

А мне как быть??? Как вернуть результат из функции wc_OpenReadCompleted ?

Или смотрим пример ViewSwitchingNavigation

там вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        public IAsyncResult BeginGetMeetings(AsyncCallback callback, object userState)
        {
            var asyncResult = new AsyncResult<IEnumerable<Meeting>>(callback, userState);
            ThreadPool.QueueUserWorkItem(
                o =>
                {
                    asyncResult.SetComplete(new ReadOnlyCollection<Meeting>(this.meetings), false);
                });

            return asyncResult;
        }

где this.meetings опять же сформирован в конструкторе.... :(

Как присвоить тому же this.meetings или Employees данные полученные с сервера?????
...
Рейтинг: 0 / 0
Помогите с Prism'ой
    #36967279
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick_K_121,

а при чем здесь Prism? к получению данных (с сервера) эта штука никакого отношения не имеет

Nick_K_121Если данные я получаю например с сервера ввиде XML по Http?
Использую WebClient добавляя обработчикесли вопрос о том как построить коллекцию объектов (типа Employee) из XML, то можно примерно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
        void wc_OpenReadCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            System.Xml.Linq.XDocument xdoc = System.Xml.Linq.XDocument.Parse(e.Result);
            this.Employees = new PagedCollectionView(xdoc.Root.Elements("Employee").Select<System.Xml.Linq.XElement, Employee>(
                i => new Employee {
                    Id = (int)i.Element("Id").Value,
                    FirstName = i.Element("FirstName").Value,
                    ... и т.д.
                }));
        }
...
Рейтинг: 0 / 0
Помогите с Prism'ой
    #36967287
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код не проверял, там есть ошибки (например, wc.OpenReadCompleted не соотв. DownloadStringCompletedEventArgs ), скопипатил с работающего примера 9421140 , но идея, надеюсь понятна...
...
Рейтинг: 0 / 0
Помогите с Prism'ой
    #36967305
Nick_K_121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, вопрос не в этом, это я знаю :(

(ну а Prism'а просто примеры от туда...)

Попробую еще раз.

есть View где в xaml есть например:
<ListBox ItemsSource="{Binding Employees}" ....

есть ViewModel где есть код: this.Employees = dataProvider.GetEmployees();

есть Model - class Employee { string Name {get;set;} } или лучше пусть он тоже во внешней библиотеке


Вот, а дальше.... есть DataProvider с методом GetEmployees()

небольшое отступление:
есть отдельная библиотека где есть
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class DataEmployees
{
      public List<Employee> Employees { get; set; }
      public Load(Uri _uri)
      {
        WebClient wc = new WebClient();
        wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
        wc.OpenReadAsync(_uri);
      }

      void wc_OpenReadCompleted(object sender, DownloadStringCompletedEventArgs e)
      {
         this.Employees = ...... ну не важно.....
      }
}
возвращаемся к

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
List<Employee> GetEmployees()
{
   DataEmployees de = new DataEmployees();
   de.Load();
И дальше что???
   return de.Employees; //?????
Здесь-то я и упираюсь.... что делать???? :)
}
...
Рейтинг: 0 / 0
Помогите с Prism'ой
    #36967325
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick_K_121,

поскольку WebClient доставляет данные с сервера асинхронно, то
авторесть ViewModel где есть код: this.Employees = dataProvider.GetEmployees(); не годится, а вот так
автор void wc_OpenReadCompleted(object sender, DownloadStringCompletedEventArgs e)
{
this.Employees = ...... ну не важно.....
}
годится, просто DataEmployees.Load надо дергать где-нить (в конструкторе или в обработчике Loaded страницы или (вью)модели, где именно - Вам видней)
...
Рейтинг: 0 / 0
Помогите с Prism'ой
    #36967332
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или, "совсем правильно", в wc_OpenReadCompleted файерить соответств.событие (типа DataLoaded), на которое вьюмодель подписывается (т.е., вариантов может быть несколько)...
...
Рейтинг: 0 / 0
Помогите с Prism'ой
    #36967354
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще вариант, передавать ссылку на обработчик
Код: plaintext
1.
2.
3.
4.
5.
6.
          public void Load(Uri _uri, DownloadStringCompletedEventHandler handler)
          {
              WebClient wc = new WebClient();
              wc.DownloadStringCompleted += handler;
              wc.DownloadStringAsync(_uri);
          }
тогда
есть ViewModel где есть код: (new DataEmployees()).Load(uri, wc_DownloadStringCompleted);
где wc_DownloadStringCompleted - обработчик во ViewModel, в котором this.Employees = ...
...
Рейтинг: 0 / 0
Помогите с Prism'ой
    #36967358
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRеще вариант, передавать ссылку на обработчик
хотя смысла выносить вызов WebClient (всего-то три строчки) в другой класс я не вижу...
...
Рейтинг: 0 / 0
Помогите с Prism'ой
    #36967361
Nick_K_121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LRтогда
есть ViewModel где есть код: (new DataEmployees()).Load(uri, wc_DownloadStringCompleted);
где wc_DownloadStringCompleted - обработчик во ViewModel, в котором this.Employees = ...

Ну в общем я так и сделал.... просто почемуто такой вариант как-то не нравится...
думал может что-то есть правильное...

Все хотел найти в инете пример полноценный (и именно для призмы), где данные подгружаются с сервера а не генерятся прямо в коде и ничего не могу найти.
Примеров уйма и везде данные генерятся прямо в коде....
...
Рейтинг: 0 / 0
Помогите с Prism'ой
    #36967407
i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
i
Гость
Правильно не нравится. С таким подходом тебе придется каждый раз создавать новый ViewModel страниц на пять, внятности там не будет.
Догика работы с БД должна быть вынесена в отдельную сущность или Моdel.
В Призм сейчас появилась навигация, на мой взгляд, самый оптимальный способ - вынести подобные моменты в ее методы.
...
Рейтинг: 0 / 0
Помогите с Prism'ой
    #36967414
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick_K_121просто почемуто такой вариант как-то не нравится...
думал может что-то есть правильное...
имхо, "совсем правильно" , т.е. DataProvider публикует событие о том что загрузка данных завершена (аналогично тому как это делает WebClient)
...
Рейтинг: 0 / 0
Помогите с Prism'ой
    #36967439
i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
i
Гость
Правильный вариант работы с асинхронными вызовами - Rx
...
Рейтинг: 0 / 0
Помогите с Prism'ой
    #36967466
Nick_K_121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что такое Rx?
...
Рейтинг: 0 / 0
Помогите с Prism'ой
    #36967615
i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
i
Гость
Rx - из разряда must have
Приблизительный вариант
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
public static IObservable<T> DownloadAsync<T>( this WebClient client, Uri address, Func<object,T> selector)
{ 
    return Observable.Create<T>(observer => 
                       { 
                            Guid token = Guid.NewGuid();
                            OpenReadCompletedEventHandler handler = (sender, args) =>
                           { 
                                if (args.UserState != token) return;
                                if (args.Cancelled) observer.OnCompleted(); 
                                else if(args.Error !=null) observer.OnError(args.Error); 
                                else { observer.OnNext(selector(args.Result)); observer.OnCompleted();  } 
                      }; 
                      client.OpenReadCompleted += handler; 
                     try { 
                           client.OpenReadAsync(address, token); 
                      } 
                     catch (Exception ex)
                    { 
                        observer.OnError(ex); 
                    } 
                    return () => client.OpenReadCompleted -= handler; }
             );
}

public static T DefaultSelector<T>(object result)
{
       return result as T;
}

public Repository<T> : IRepository<T> 
{
     public Observable<T> LoadAsync<T>(Uri uri)
     {
           return LoadAsync<T>(uri, DefaultSelector);
     }

    protected Observable<T> LoadAsync<T>(Uri uri, Func<object,T> selector)
    {
          return new WebClient().DownloadAsync(uri, selector);
    }
}

public ViewModel<T> : IViewModel<T>
{
       private IRepository<T> _repository;

      public ViewModel(IRepository<T> repository)
      {
          _repository = repository;
      }

       public T Model
       {
            get { .......... }
            set  {  ...........}
        }

      public void Load(Uri uri)
      {
           _repository.LoadAsync<T>(uri).SubscribeOnDispatcher(
                                  e = > {  Model = e; }, 
                                  ex => { //обработчик ошибок }
             );
       }
             
...
Рейтинг: 0 / 0
Помогите с Prism'ой
    #36967680
Nick_K_121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже то, что надо. Отлично.

Спасибо.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Помогите с Prism'ой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]