Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Помогите с Prism'ой / 15 сообщений из 15, страница 1 из 1
20.11.2010, 12:54
    #36967237
Nick_K_121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Prism'ой
Может я тривиальные вещи буду спрашивать - не пинайте - я только начинаю изучать 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
20.11.2010, 13:55
    #36967279
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Prism'ой
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
20.11.2010, 14:02
    #36967287
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Prism'ой
код не проверял, там есть ошибки (например, wc.OpenReadCompleted не соотв. DownloadStringCompletedEventArgs ), скопипатил с работающего примера 9421140 , но идея, надеюсь понятна...
...
Рейтинг: 0 / 0
20.11.2010, 14:21
    #36967305
Nick_K_121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Prism'ой
Нет, вопрос не в этом, это я знаю :(

(ну а 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
20.11.2010, 14:48
    #36967325
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Prism'ой
Nick_K_121,

поскольку WebClient доставляет данные с сервера асинхронно, то
авторесть ViewModel где есть код: this.Employees = dataProvider.GetEmployees(); не годится, а вот так
автор void wc_OpenReadCompleted(object sender, DownloadStringCompletedEventArgs e)
{
this.Employees = ...... ну не важно.....
}
годится, просто DataEmployees.Load надо дергать где-нить (в конструкторе или в обработчике Loaded страницы или (вью)модели, где именно - Вам видней)
...
Рейтинг: 0 / 0
20.11.2010, 14:53
    #36967332
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Prism'ой
или, "совсем правильно", в wc_OpenReadCompleted файерить соответств.событие (типа DataLoaded), на которое вьюмодель подписывается (т.е., вариантов может быть несколько)...
...
Рейтинг: 0 / 0
20.11.2010, 15:18
    #36967354
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Prism'ой
еще вариант, передавать ссылку на обработчик
Код: 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
20.11.2010, 15:22
    #36967358
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Prism'ой
LRеще вариант, передавать ссылку на обработчик
хотя смысла выносить вызов WebClient (всего-то три строчки) в другой класс я не вижу...
...
Рейтинг: 0 / 0
20.11.2010, 15:24
    #36967361
Nick_K_121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Prism'ой
LRтогда
есть ViewModel где есть код: (new DataEmployees()).Load(uri, wc_DownloadStringCompleted);
где wc_DownloadStringCompleted - обработчик во ViewModel, в котором this.Employees = ...

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

Все хотел найти в инете пример полноценный (и именно для призмы), где данные подгружаются с сервера а не генерятся прямо в коде и ничего не могу найти.
Примеров уйма и везде данные генерятся прямо в коде....
...
Рейтинг: 0 / 0
20.11.2010, 16:13
    #36967407
i
i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Prism'ой
Правильно не нравится. С таким подходом тебе придется каждый раз создавать новый ViewModel страниц на пять, внятности там не будет.
Догика работы с БД должна быть вынесена в отдельную сущность или Моdel.
В Призм сейчас появилась навигация, на мой взгляд, самый оптимальный способ - вынести подобные моменты в ее методы.
...
Рейтинг: 0 / 0
20.11.2010, 16:21
    #36967414
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Prism'ой
Nick_K_121просто почемуто такой вариант как-то не нравится...
думал может что-то есть правильное...
имхо, "совсем правильно" , т.е. DataProvider публикует событие о том что загрузка данных завершена (аналогично тому как это делает WebClient)
...
Рейтинг: 0 / 0
20.11.2010, 16:56
    #36967439
i
i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Prism'ой
Правильный вариант работы с асинхронными вызовами - Rx
...
Рейтинг: 0 / 0
20.11.2010, 17:14
    #36967466
Nick_K_121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Prism'ой
Что такое Rx?
...
Рейтинг: 0 / 0
20.11.2010, 19:37
    #36967615
i
i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Prism'ой
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
20.11.2010, 20:54
    #36967680
Nick_K_121
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с Prism'ой
Похоже то, что надо. Отлично.

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


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