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
MateoRobiApke
wtorek, 31 maja 2016
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
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
A tutaj wystarczy do Zmiennej dopisac jedna linijke kodu OnPropertyChanged("Nazwa Zmiennej").
Teraz gdy zmieni się wartość zmiennej View zostaje powiadomione o zmianie.
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));
}
Teraz gdy zmieni się wartość zmiennej View zostaje powiadomione o zmianie.
public class WarsztatViewModel : Notify
{
{
private int warsztatId;
public int WarsztatId
{
public int WarsztatId
{
get{return warsztatId};
set
{
set
{
if(value! = warsztatId)
{
}{
warsztatId = value;
OnPropertyChanged("WarsztatId");
} 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.
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:
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.
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.
-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}">
</Window.Resources>
<DockPanel Margin="20">
</DataTemplate>
<TextBox Text="{Binding Path=WarsztatId, UpdateSourceTrigger=PropertyChanged}" />
<Button Content="Get Product" Command="{Binding Path=GetProductCommand}"/>
</DockPanel>
<Button Content="Get Product" Command="{Binding Path=GetProductCommand}"/>
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
{
{
public ICommand GetProductCommand
{
private int warsztatId;
private ICommand getProductCommand;
private ICommand saveProductCommand;
public int WarsztatId
{
get{return warsztatId};
set
{
public WarsztatModel Warsztatset
{
if(value! = warsztatId)
{
}{
warsztatId = value;
ZgloszenieZmianyValueDlaView("WarsztatId");
} ZgloszenieZmianyValueDlaView("WarsztatId");
{
get{return warsztat};
set
{
}set
{
if(value! = warsztat)
{
}{
warsztat = value;
ZgloszenieZmianyValueDlaView("Warsztat");
} ZgloszenieZmianyValueDlaView("Warsztat");
public ICommand GetProductCommand
{
get
{
if(getProductCommand == null)
{
return getProductCommand;
}
}{
if(getProductCommand == null)
{
getProductCommand = new RelayCommand(
param => GetProduct(),
param => WarsztatId > 0
);
}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"/>
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 :).
-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
Subskrybuj:
Posty (Atom)