Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: c# WP7 - dziedziczenie
Forum PHP.pl > Inne > Hydepark
djbarca
witam. poddaje się.. drugi dzien szukam rozwiązania i nic ;/ problem jest przy aplikacji mobilnej... mam przykladowo nowe okno z jakas strona aplikacji i mam klase glowna ktora dziedziczy po: PhoneAplicationPage , oraz mam druga klase ktora chcialbym sobie dolaczyc do klasy glownej - przyklad:


  1.  
  2. namespace dz.files
  3. {
  4. public class data
  5. {
  6. public data()
  7. {
  8.  
  9. }
  10. }
  11. public partial class przedmiotyLista : PhoneApplicationPage
  12. {
  13. public przedmiotyLista()
  14. {
  15. InitializeComponent();
  16. }
  17. }
  18. }


jak powinny wykladac klasy , zebym mogl w klasie glownej(przedmiotyLista) zaraz po PhoneApplicationPage mogl dziedziczyc rowniez klase data.. jesli spróbuje tak zrobi to wyswietla mi blad:


"Error 1 Class 'dz.files.przedmiotyLista' cannot have multiple base classes: 'Microsoft.Phone.Controls.PhoneApplicationPage' and 'data' C:\Users\pawel\Desktop\dz\dz\dz\files\przedmiotyLista.xaml.cs" ... pewnie okaze sie jak zwykle, ze rozwiazanie bylo banalne tylko ja glupi nie moglem go znalezc :/
batman
Nie tędy droga. Napisz co chcesz uzyskać, a będzie łatwiej znaleźć rozwiązanie.
djbarca
Mam jakaś tam aplikacje ktora zawiera np przedmioty i oceny .. zrobilem calosc na osobnych oknach. Opcja przedmioty i opcja oceny. Uklad plikow: http://scr.hu/6ip/hyfmw
.. no i teraz po wejsciu do pliku lista ocen albo/i po wejsciu do pliku z lista przedmiotow potrzebne mi sa te same funkcje. Teraz po prostu je skopiowalem ale to bez sensu..
batman
Z tego co napisałeś wnioskuję, że logikę trzymasz w code behind, a tam powinny znaleźć się tylko metody reagujące na jakieś zdarzenia. Przenieś logikę do nowej klasy (modelu) i w obsłudze zdarzenia wywołaj odpowiednią metodę z tego modelu.
djbarca
ouu: jak? Jestem, przyznaje się, początkujący w c# pod apl. mobilne ;/ .. moze ja pokaze jak to wyglada teraz (tzn poza tym , ze zmienilem uklad plikow) to w taki sposob robilem calosc. http://scr.hu/6ip/1oz6t . w MainPage.xaml mam jakies menu glowne. i potem poprzez NavigationService.Navigate odsylam do poszczegolnych plikow.
batman
Stwórz katalog Models (na tym samym poziomie co np, files). W tym katalogu dodaj klasę (prawym myszy na utworzonym katalogu -> Add -> Class). W klasie tej stwórz metody wykonujące odpowiednie operacje i odwołaj się do tych metod w obsłudze zdarzeń. W pliku z code behind (c# dla widoku) dodaj
[CSHARP] pobierz, plaintext
  1. using dz.Models
[CSHARP] pobierz, plaintext
, a obsłudze zdarzenia utwórz obiekt modelu i wywołaj odpowiednią metodę. Jeśli zajdzie taka potrzeba, przekaż odpowiednie parametry. W sumie nie różni się to zbytnio od standardowego WPF, z tą różnicą, że wszystkie (zdecydowana większość) wbudowanych klas, działa asynchronicznie i trzeba bawić się w bindowanie pól ViewModelu.
djbarca
czyli generalnie chodzi o to, zeby w tym folderze Models byl plik z klasa ktora zawiera metody , zmienne itp.. a dopiero w konstruktrze/innych metodach moich "stron" aplikacji tworze obiekt i operuje na klasie z models? biggrin.gif
batman
Jak w PHP dominującym wzorcem jest MVC, tak na WP7 takim wzorcem jest MVVM: Model - View - ViewModel (nie wiem czy są jakieś inne możliwe do implementacji). W dużym skrócie polega on na tym, że Model (M) zasila ViewModel (VM) danymi, a VM bindowany jest do widoku (V). Dzięki temu wprowadzając zmiany w VM, widok wie, że musi się "odświeżyć".
djbarca
Na jaki adres wysłac tą krate piwa? biggrin.gif dzięki wielkie. Postaram sie juz nie pytac (chociaz znajac życie to jeszcze na jakis problem napotkam) wink.gif


edit:

a jednak... wszystko działa tak jak powinno (tzn bez dziedziczenia) ale... no własnie. Mam zbindowaną listę .. w liście znajduje się przycisk który zawiera tag z identyfikatorem.
Teraz tak: wczytuje liste przedmiotów, klikam w przycisk , pobieram identyfikator, usuwam z listy dana wartosc, zapisuje liste (bo calosc jest na plikach xml) i przekierowuje.
Niby wszystko ładnie tyle ze zamiast jednej wartosci znika mi całość dodatkowo nie mogę ponownie dodać oceny.

Kod strony usuwającej: http://wklej.org/id/783397/
Kod strony dodającej: http://wklej.org/id/783398/
Kod klasy zarządzającej danymi: http://wklej.org/id/783399/

nie wiem czy najgorsze czy najlepsze w tym wszystkim jest to , ze usuwanie ocen działa w ten sposob tak jak powinno a usuwanie przedmiotow już nie. Zarówno oceny i przedmioty usuwane są po swoim identyfikatorze, identyfikator sie nie powtarza
czy coś jest od strony logicznej źle?
batman
Musiałbyś sprawdzić w metodach usuwających co zawierają listy. Bardzo możliwe, że zwraca Ci więcej danych niż powinno. Jeśli to będzie ok, to tam, gdzie przechwytujesz wyjątki podczas korzystania z Isolated Storage, wyświetl komunikaty błędów.
djbarca
ręce opadają... teraz zrobilem juz tak jak pisałeś. wszystko nawet ładnie . klikam w przedmiot , przedmiot jest usuwany ale jak klikam np menu głowne->przedmioty (zeby zobaczyc jak ta moja lista z przedmiotami wyglada) to co? nie ma nic ... a może to przez to ze ja 2x wykonuje odczyt z 2 roznych plikow w tym samym momencie. A potem np przy usuwaniu znowu wywoluje funkcje init ktora znowu wywoluje nowy model ktory w następstwie znowu wywoluje metody wczytujace pliki? nie wiem ..
czy otwierajac plik przy pomocy tego kodu mozna jakos zablokowac odcvzyt zeby drugi raz nie wczytalo go dopoki nie zapisze poprzedniego?

  1. using (IsolatedStorageFile myIsolatedStorage2 = IsolatedStorageFile.GetUserStoreForApplication())
  2. {
  3. using (IsolatedStorageFileStream stream2 = myIsolatedStorage2.OpenFile("przedmioty.xml", FileMode.OpenOrCreate))
  4. {
  5.  
  6. }
  7. }


wylapalem wyjatki i jest np tak(tyklo dla przedmiotow):
przy pierwszym wejsciu do programu - "There is an error in XML document (0,0)
po kliknieciu w usuniecie przedmiotu - "There is an error in XML document (1, 159)
i potem jak ponownie wchodze w liste przedmiotow jest taki sam blad jak po kliknieciu


zastanawia mnie jeszcze czy tak napisany kod jest poprawny?

tzn konstruktor wywoluje funkcje init ktora tworzy nowy obiekt modelu, binduje elementy a nastepnie po kliknieciu w przycisk usun:

  1. /*ref usun przedmiot*/
  2. private void button8_Click(object sender, RoutedEventArgs e)
  3. {
  4. Button btn = sender as Button;
  5. int zmienna = int.Parse(btn.Tag.ToString());
  6.  
  7. data.usunPrzedmiot(zmienna);
  8.  
  9. data.zapisPrzedmioty();
  10.  
  11. init();
  12.  
  13. NavigationService.Navigate(new Uri("/files/przedmiotyLista.xaml", UriKind.Relative));
  14. }


usunac z listy przedmiotow dany przedmiot, zapisac , wywolac funkcje init i przekierowac? czy to ma sens i przypadkiem czegos nie omija?
batman
Wydaje mi się, że źle podchodzisz do sprawy z zapisywaniem danych. Jeśli koniecznie musisz korzystać z XML, to wczytuj zawartość pliku do pamięci w metodach Application_Launching oraz Application_Activated, a aktualny stan zapisuj do pliku w metodach Application_Deactivated oraz Application_Closing. Metody te znajdziesz w App.xaml.cs. W ten sposób Twoja aplikacja przyspieszy, bo operacje na plikach są o wiele wolniejsze niż operacje na obiektach w pamięci.
Żeby uniknąć ciągłego wczytywania danych do kontrolek po dodaniu/usunięciu elementów z kolekcji, zastosuj interfejs INotifyPropertyChanged. W takim przypadku po zbindowaniu danych do kontrolki, każda wprowadzona w danych zmiana zostanie odwzorowana w widoku. Jeśli do bindowania dodasz parametr TwoWay, to zmiana w widoku (na zaznaczenie checkboxa) zostanie automatycznie zapisana. W przypadku kolekcji zastosuj typ ObservableCollection. Dzięki niemu lista będzie automatycznie się aktualizowała po wprowadzeniu zmian w kolekcji.
djbarca
nie wierzę! FileMode.Truncate :| działa.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.