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