Trace:
Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
mvvm [2019/01/11 09:56] yura |
mvvm [2019/01/13 12:01] (current) yura |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | **''MVVM Pattern - Реалізація патерна''** | + | **''MVVM Pattern - Реалізація патерна''** |
| ---- | ---- | ||
| **Лейбли** and **Binding** в XAML __(в XAML забіндити можна все що завгодно!)__ | **Лейбли** and **Binding** в XAML __(в XAML забіндити можна все що завгодно!)__ | ||
| <Code:csharp> | <Code:csharp> | ||
| - | Foreground="Red" Міняє колір вмісту | + | Foreground="Red" Міняє колір вмісту |
| - | FontSize="50" Величена вмісту | + | FontSize="50" Величена вмісту |
| - | FontFamily="Segoe UI" Які шрифти будуть використані | + | FontFamily="Segoe UI" Які шрифти будуть використані |
| - | Content="{Binding Time}" Бінд який падає в клас StopwatchViewModel з інтерфейсом INotifyPropertyChanged | + | HorizontalContentAlignment="Center" Вірівнення по ширині |
| - | HorizontalContentAlignment="Center" Вірівнення по ширині | + | VerticalContentAlignment="Center" Вірівнення по висоті |
| - | VerticalContentAlignment="Center" Вірівнення по висоті | + | Margin="0, 0, 0, -200" Зсунути в низ на 200 px |
| - | </Code> | + | Content="{Binding Time}" Бінд який падає в клас StopwatchViewModel : INotifyPropertyChanged |
| + | Content="{Binding Time, TargetNullValue='00.00 UAH'}" TargetNullValue виводить введений текст зразу на екран (в деф позицію) | ||
| + | |||
| + | Command="{Binding StartStopwatch}" Біндить якусь дію (в нашому випадку це кнопка) | ||
| + | </Code> | ||
| <Code:xaml> | <Code:xaml> | ||
| <Label Content="{Binding Time}" Foreground="Red" FontFamily="Segoe UI" FontSize="50" VerticalContentAlignment="Center" ></Label> | <Label Content="{Binding Time}" Foreground="Red" FontFamily="Segoe UI" FontSize="50" VerticalContentAlignment="Center" ></Label> | ||
| Line 36: | Line 40: | ||
| </Code> | </Code> | ||
| - | * Любі класи в XAML використовується тільки для виклику **(НЕ РЕАЛІЗАЦІЇ)** | + | * Любі класи в XAML використовується тільки для виклику **(НЕ РЕАЛІЗАЦІЇ ЛОГІКИ)** |
| * DataContext потрібен для того щоб достукатись до МОДЕЛЕЙ класу StopwatchViewModel з інтерфейсом INotifyPropertyChanged (Дефолтна штука, якось працює під капотом) | * DataContext потрібен для того щоб достукатись до МОДЕЛЕЙ класу StopwatchViewModel з інтерфейсом INotifyPropertyChanged (Дефолтна штука, якось працює під капотом) | ||
| * timer реалізовує TimerMonitor який приймає конструктор класу StopwatchViewModel | * timer реалізовує TimerMonitor який приймає конструктор класу StopwatchViewModel | ||
| * При виклику timer.startstopWatch(); запускає DispatcherTimer і Stopwatch (тому що в конструкторі НЕ ПРИПУСТИМО робити запуск програми) | * При виклику timer.startstopWatch(); запускає DispatcherTimer і Stopwatch (тому що в конструкторі НЕ ПРИПУСТИМО робити запуск програми) | ||
| + | ---- | ||
| + | **Бінд кнопки виглядає наступним чином** | ||
| + | <Code:csharp> | ||
| + | <Button Content="Click" Command="{Binding StartStopwatch}" Width="100" Height="25" HorizontalContentAlignment="Center" Margin="0, 0, 0, -200"></Button> | ||
| + | </Code> | ||
| + | |||
| + | |||
| + | **Реалізація класу ButtonCommand через інтерфейс ICommand** | ||
| + | <Code:csharp> | ||
| + | namespace CounterSalary.ViewModel | ||
| + | { | ||
| + | public class ButtonCommand : ICommand | ||
| + | { | ||
| + | private readonly Action action; | ||
| + | public event EventHandler CanExecuteChanged; | ||
| + | |||
| + | public ButtonCommand(Action action) | ||
| + | { | ||
| + | this.action = action; | ||
| + | } | ||
| + | |||
| + | public bool CanExecute(object parameter) | ||
| + | { | ||
| + | return true; | ||
| + | } | ||
| + | |||
| + | public void Execute(object parameter) | ||
| + | { | ||
| + | action(); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </Code> | ||
| + | **Робиться для того щоб потім можна було його реалізувати через моделі** 👇👇👇 | ||
| + | <Code:csharp> | ||
| + | public ButtonCommand StartStopwatch { get; set; } = new ButtonCommand(() => | ||
| + | { | ||
| + | _timer.startStopwatch(); | ||
| + | }); | ||
| + | </Code> | ||
| ---- | ---- | ||
| **Даємо івенти на nameof** - будь це хоч Margin хоч Context __(Це один з методів реалізування Біндінгів)__ | **Даємо івенти на nameof** - будь це хоч Margin хоч Context __(Це один з методів реалізування Біндінгів)__ | ||
| Line 112: | Line 157: | ||
| Цей клас **реалізовує логіку** таймера, а саме | Цей клас **реалізовує логіку** таймера, а саме | ||
| В конструкторі створюється івент на таймер | В конструкторі створюється івент на таймер | ||
| - | |||
| - | Ця залупа робить логіку йобаного таймера | ||
| - | В конструкторі заборонено робити любу логіку | ||
| - | Позволено давати ІВЕНТИ та передавати параметр який заходить в конструктор, в MainWindow | ||
| _model.Time = currentTime Заходить в INotifyPropertyChanged і сетить нове значення рівне currentTime - і таким чином в лейблі міняється значення | _model.Time = currentTime Заходить в INotifyPropertyChanged і сетить нове значення рівне currentTime - і таким чином в лейблі міняється значення | ||
