wtorek, 31 maja 2016

Error :D

Już dzisiaj ostatni dzień konkursu Daj się poznać !
Niestety nie udało mi się dokończyć Apki.
Ale na pewno to zrobię. Od kilku dni zmagam się z EntityFramework.
Jest to bardzo wkurzające :D
bo robię wszystko według tutoriala ale niestety nie działa. Odpalam EF Model First. I gdy chcę już uruchomić skrypt który tworzy BazeDanych. Wyskakuje błąd ;p Szukam rozwiązania w goglach, ale puki co bez rezultatu. Jak już znajdę problem na pewno go opisze razem z rozwiązaniem. Ale to w następnym poście.:D

niedziela, 24 kwietnia 2016

EntityFramework epizod 1

Na początku najważniejsze info które znalazłem na necie:D

EntityFramework ADO.NET to narzędzie typu Object Relational Mapping i służy do odwzorowania relacyjnej bazy danych za pomocą obiektów. Jest to potrzebne ponieważ sposób przechowywania informacji w bazie danych jest inny niż w podejściu obiektowym.


Rysunek ze strony

Tak jak widać na rysunku Entity Framework pozwala na oddzielenie warstwy prezentacji od danych.

EntityFramework udostępnia 3 sposoby na stworzenie modelu danych:

-Database First używamy gdy mamy już gotową bazę danych i chcemy ja wykorzystać.

-Model First ten sposób uwalnia nas od pisania kodu SQL. Modele tworzymy w Entity data model designer i następnie na podstawie tego modelu tworzona jest baza danych

-Code First najpierw piszemy kod i na podstawie kodu jest tworzony model i struktura bazy danych.

Dla dociekliwych kilka artykułów związanych z EF które znalazłem i prawdopodobnie opisze je w kolejnych epizodach :D

-Pierwszy artykuł - jak EF zarządzą zależnościami pomiędzy tabelami

-Drugi artykuł - tworzenie nowej bazy danych podejscie MODEL FIRST na tej stronie mozna tez znaleźć Code First i Database First

-Trzeci artykuł - Wprowadzenie do Entity Framework

środa, 20 kwietnia 2016

Podsumowanie

W dzisiejszym poście chciałbym opisać krótko swoje postępy i co zamierzam robić w dalej. Na początku była teoria o MVVM.
Po przerobieniu teorii przyszedł czas na praktykę.

Zacząłem od stworzenia oddzielnych folderów na View ,

ViewModel , Model(nigdzie nie było o tym napisane ale pomyślałem że nie zaszkodzi tak zrobić :D).

Następnie stworzyłem View dla każdego okienka które chcę wyświetlić.

Następnie powstał ViewModel i Model.

Model dziedziczył po klasie z zaimplementowanym interfejsem INotifyPropertyChanged.

Kolejny krok to sprawdzenie czy działa :D.Sprawdzałem każdy View oddzielnie.

Wyglądało to tak że tworzyłem obiekt dla głównego okna i jako dataContext ustawiałem nowy obiekt ViewModel.

Wszystko zadziałało jak trzeba.

Następnie zacząłem tworzyć zmienne ICommand żeby obsłużyć kliknięcia przycisków.

I póki co jeszcze nie skończyłem :D. Po skończeniu z ICommand ,
następnym elementem apki będzie EntityFramework.

W tej chwili wydaję mi się, że po zaimplementowaniu EntityFramework pod względem funkcjonalności Apka będzie już skończona.

Pozostanie tylko dopracowanie wyglądu.

Podczas szukania info o MVVM natknąłem się na artykuł EntityFramework-Aplikacja Trójwarstwowa.

W odróżnieniu od mojego projektu wersja z artykułu posiada warstwę pomiędzy warstwą prezentacji(WPF),

a warstwą dostępu do danych(EntityFramework) i jest to WCF.

I pomyślałem że mógłbym zrobić to u siebie.

W pierwszym założeniu aplikacja miała być odpalana na komputerze mechanika i tylko on mógłby z niej korzystać.

Baza danych była by na tym komputerze na którym apka.

Jeżeli starczy czasu to spróbuje zrobić to tak jak w artykule.

Wtedy Baza danych będzie na serwerze a dzięki usługom sieciowym WCF apka będzie mogła działać na każdym sprzęcie podłączonym do internetu.

Co zostało do Zrobienia (W Skrócie):
-EntityFramework(Czyli dostep do danych jeżeli dobrze zrozumiałem baza danych zostanie wygenerowana automatycznie)

-Zrobienie ładnego UI(w tej chwili jest koszmarny ale to sie zmieni)

-Nadrobienie Postów (miały być 2 tygodniowo :D)

niedziela, 10 kwietnia 2016

MVVM INotifyPropertyChanged

W tym poście chciałbym tylko pokazać jak wygląda najprostsza implementacja interfejsu INotifyPropertyChanged.
Poniżej jest kawałek mojego kodu który zawiera minimum tego co wystarczy żeby View był powiadamiany o zmianach danych które wystąpiły w Model albo ViewModel.
Interfejs INotifyPropertyChanged należy zaimplementować w klasie Model i ViewModel. Jak już pisałem we wcześniejszych postach zostaje wykorzystywany do informowania View o zmianie wartości naszych danych
public class Notify : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
{
if(PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
A tutaj wystarczy do Zmiennej dopisac jedna linijke kodu OnPropertyChanged("Nazwa Zmiennej").
Teraz gdy zmieni się wartość zmiennej View zostaje powiadomione o zmianie.
public class WarsztatViewModel : Notify
{
private int warsztatId;
public int WarsztatId
{
get{return warsztatId};
set
{
if(value! = warsztatId)
{
warsztatId = value;
OnPropertyChanged("WarsztatId");
}
}

poniedziałek, 21 marca 2016

MVVM epizod 2

VIEW
Komunikacja pomiędzy View i ViewModel odbywa się poprzez
-data binding
-commands
-change notification event

ViewModel uaktualnia Model, konwertuje dane ,jest odpowiedzialny z validacje i łączenie danych aby wyświetlić je w View.

View jest odpowiedzialny za wygląd czyli to co widzi użytkownik. Idealny przypadek to gdy View zawiera wszystko w pliku XAML, a kod w C# posiada tylko konstruktor z metodą InitializeComponent().

Jednak kod w C# może zawierać elementy które ciężko jest zaimplementować w XAML-u takie jak animacje.

W View dataContext zawiera ViewModel. ViewModel implementuje właściwosci i commands które są wiązane z View.

View jest powiadamiane o zmianach poprzez changeNotificationEvents.

Przeważnie View jest klasą pochodną klasy Control lub UserControl ale w niektórych przypadkach view jest stworzony z data template.

Data template służy m.in do wiązania naszego view z viewModel. Data template może być zdefiniowany w controlce która go używa, lub w resource.dictionary .

Podsumowując:
-Głównym elementem View może być Window, Page, UserControl, DataTemplate.
-View jest połączone z ViewModel poprzez właściwośc DataContext.
-View może używać walidacji do sprawdzania wpisywanych danych.


<Window.Resources>
<DataTemplate DataType="{x:Type local:ProductViewModel}">
<DockPanel Margin="20">
<TextBox Text="{Binding Path=WarsztatId, UpdateSourceTrigger=PropertyChanged}" />
<Button Content="Get Product" Command="{Binding Path=GetProductCommand}"/>
</DockPanel>
</DataTemplate>
</Window.Resources>
Powyżej prosty przykład mniej wiecej jak to ma wygladać ;D a wiecej info razem z kodem do pobrania znajdziecie na tej stronce.
ViewModel

ViewModel implementuje właściwosci, i commands które są powiązane z View dzięki data binding.

ViewModel jest odpowiedzialny z interakcję View z Model.

ViewModel nie posiada bezpośredniej referencji do View , ale informacja o zmianie danych jest komunikowana poprzez change notification events , dlatego musi dziedziczyć interfejs INotifyPropertyChanged lub INotifyCollectionChanged w przypadku gdy występuje kolekcja danych.

Co zawiera klasa ViewModel:
public class WarsztatViewModel : ObiektZImplemetacjaINCH
{
private WarsztatModel warsztat;
private int warsztatId;
private ICommand getProductCommand;
private ICommand saveProductCommand;

public int WarsztatId
{
get{return warsztatId};
set
{
if(value! = warsztatId)
{
warsztatId = value;
ZgloszenieZmianyValueDlaView("WarsztatId");
}
}
public WarsztatModel Warsztat
{
get{return warsztat};
set
{
if(value! = warsztat)
{
warsztat = value;
ZgloszenieZmianyValueDlaView("Warsztat");
}
}
}
public ICommand GetProductCommand
{
get
{
if(getProductCommand == null)
{
getProductCommand = new RelayCommand(
param => GetProduct(),
param => WarsztatId > 0
);
}
return getProductCommand;
}
}
private void GetProduct()
{

}
}


W kodzie powyżej nasza klasa dziedziczy po klasie w której został zaimplementowany interfejs INotifyPropertyChanged, ale kod tej klasy pokaże w następnym poście.
WarsztaViewModel zawiera obiekt WarsztatModel. Widzimy że przy modyfikacji tego obiektu zostanie najpierw sprawdzony warunek czy faktycznie coś się zmieniło a jeżeli się zmieniło to zostaje wywołana metoda ZgloszenieZmianyValueDlaView("Warsztat") czyli jak sama metoda mówi za siebie zostaje wysłanie info dla View że coś się zmieniło i że trzeba aktualizować wartość naszego pola w View.
Obiekty typu ICommand posłuża do wywoływania metod np gdy naciśniemy buttona.
Po kliknieciu buttona którego właściwosc Command jest bindowana do GetProductCommand tworzyny jest nowy obiekt RelayCommand, a
parametry konstruktora to kolejno funkcja która się wykona, i warunek który jeżeli jest spełniony pozwoli na wykonanie funkcji.

<Button> Content="Get" VerticalAlignment="Center"
Command="{Binding Path=GetProductCommand}" Width="100"/>
Model

Model jest odpowiedzialny za zarządzanie danymi.

Nie posiada referencji do View ani do ViewModel i nie jest zależny od ich implementacji.

Model tak jak ViewModel dziedziczy po INotifyPropertyChanged. Dzięki temu może być również powiązany poprzez binding w View.

Jest również wykorzystywany do uzyskiwania danych z baz danych itp.

środa, 9 marca 2016

MVVM epizod 1

Postanowiłem że do mojej apki użyje wzorca MVVM. Szukałem informacji jak wyświetlać wiele stron bez tworzenia dla każdej strony oddzielnego okna. Tzn tworze główne okno i następnie w nim zmieniam tylko Content tak żeby zmianie ulegała zawartość bez wyświetlania nowego okna. W aplikacji warsztat będzie kilka stron odpowiedzialnych m.in za logowanie mechanika, dodawanie samochodów, dodawanie napraw, wyświetlanie danych samochodu, wyświetlanie napraw. Dlatego wolałbym żeby te rzeczy nie były obsługiwane w nowym oknie. I tak właśnie gdzieś na mądrym forum znalazłem info że warto użyć MVVM. Nie wiem czy to jest najlepszy wybór ale zobaczymy co z tego wyniknie :D.


Na początku trochę teorii ze strony Microsoftu.
-MVVM to skrót od Model-View-ViewModel
-MVVM pozwala na oddzielenie logiki aplikacji od UI.
-Pomaga w rozwiązywaniu problemów projektowych.
-Aplikacja staje się łatwiejsza w testowaniu,utrzymaniu i rozwoju.

Używając MVVM interfejs użytkownika, logika prezentacji i logika aplikacji jest rozdzielona pomiędzy 3 klasy:
-Model zawiera logike aplikacji i dane(chociaż w innym artykule przeczytalem że powinien zawierać tylko dane).
-View zawiera w sobie UI czyli to co widzimy.
-ViewModel zawiera logikę prezentacji(tutaj jest cały kod który się wykona np: po kliknięciu buttona).


Na rysunku zależności pomiędzy MVVM


To był krótki wstęp do MVVM niedługo pojawi się epizod 2 :).

środa, 2 marca 2016

DajSiePoznac 2016

Cześć właśnie zaczynam swoją przygodę w konkursie daj się poznać. Efektem końcowym (mam nadzieje:D) będzie program dla mechanika,który pozwoli mu na:
-dodawanie nowych samochodów
-wyświetlanie samochodów i historie napraw
-dodawanie napraw do samochodów
-dodawanie notatek do napraw
-przypomnienie o zbliżającym się przeglądzie technicznym
Plan działania:
-Zrozumienie i zastosowanie wzorca MVVM dla WPF
-projekt APKI chcę to zrobić podobnie jak jest w tej książce Zwinne wytwarzanie Oprogramowania...
- Wybór jakiejś bazy danych która najlepiej współpracuje z C# :D - Kodzenie :D


Następne posty niedługo powodzenia wszystkim którzy chcą DAĆ SIĘ POZNAĆ ;) PoZdRaWiAm :D