IMI docs

Trace:

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
mvvm [2019/01/11 09:55]
superuser
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 __(Це один з методів реалізування Біндінгів)__
 <​Code:​csharp>​ <​Code:​csharp>​
 delegate { } - пустая функция,​ але може бути і не пустою,​ завдяки неї з варки мажна зробити метод delegate { } - пустая функция,​ але може бути і не пустою,​ завдяки неї з варки мажна зробити метод
Line 70: Line 116:
 } }
 </​Code>​ </​Code>​
-**Даємо івенти на nameof** - будь це хоч Margin хоч Context __(Це один з методів реалізування Біндінгів)__ 
  
 Якщо ви імплементуєте інтерфейс **INotifyPropertyChanged**,​ то ви маєте реалізувати **event PropertyChanged**,​ і відправити його кожен раз, коли значення міняється. Якщо ви імплементуєте інтерфейс **INotifyPropertyChanged**,​ то ви маєте реалізувати **event PropertyChanged**,​ і відправити його кожен раз, коли значення міняється.
  
 ---- ----
 +**Рівень сервісу** __(потрібен для реалізації логіки)__
 <​Code:​csharp>​ <​Code:​csharp>​
 namespace CounterSalary.Service namespace CounterSalary.Service
Line 109: Line 154:
 </​Code>​ </​Code>​
  
-**Рівень сервісу** __(потрібен для реалізації логіки)__+
 Цей клас **реалізовує логіку** таймера,​ а саме Цей клас **реалізовує логіку** таймера,​ а саме
 В конструкторі створюється івент на таймер В конструкторі створюється івент на таймер
- 
-Ця залупа робить логіку йобаного таймера 
-В конструкторі заборонено робити любу логіку 
-Позволено давати ІВЕНТИ та передавати параметр який заходить в конструктор,​ в MainWindow ​ 
 _model.Time = currentTime Заходить в INotifyPropertyChanged і сетить нове значення рівне currentTime - і таким чином в лейблі міняється значення _model.Time = currentTime Заходить в INotifyPropertyChanged і сетить нове значення рівне currentTime - і таким чином в лейблі міняється значення