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:45]
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>​
 <Label Margin="​{Binding Xyi}" ​ FontFamily="​Segoe UI" FontSize="​50"​ HorizontalContentAlignment="​Center"></​Label>​ <Label Margin="​{Binding Xyi}" ​ FontFamily="​Segoe UI" FontSize="​50"​ HorizontalContentAlignment="​Center"></​Label>​
 </​Code>​ </​Code>​
 +
 +
 ---- ----
 **xaml.cs** __(грубо кажучи це просто main метод!)__ **xaml.cs** __(грубо кажучи це просто main метод!)__
-  * Метод по дефу, потрібен для виклику (НЕ РЕАЛІЗАЦІЇ) реалізовуючих класів +
-  * DataContext потрібен для того щоб достукатись до МОДЕЛЕЙ класу StopwatchViewModel з інтерфейсом ​ INotifyPropertyChanged (Дефолтна штука, якось працює під капотом) +
-  * timer реалізовує TimerMonitore який приймає конструктор класу StopwatchViewModel +
-    * При виклику timer.startstopWatch();​ запускає DispatcherTimer ​ і Stopwatch ​ (тому що в конструкторі НЕ ПРИПУСТИМО робити запуск програми)+
 <​Code:​csharp>​ <​Code:​csharp>​
 namespace CounterSalary namespace CounterSalary
Line 37: Line 39:
 } }
 </​Code>​ </​Code>​
 +
 +  * Любі класи в XAML використовується тільки для виклику **(НЕ РЕАЛІЗАЦІЇ ЛОГІКИ)**
 +  * DataContext потрібен для того щоб достукатись до МОДЕЛЕЙ класу StopwatchViewModel з інтерфейсом ​ INotifyPropertyChanged (Дефолтна штука, якось працює під капотом)
 +  * timer реалізовує TimerMonitor який приймає конструктор класу StopwatchViewModel
 +    * При виклику timer.startstopWatch();​ запускає DispatcherTimer ​ і Stopwatch ​ (тому що в конструкторі НЕ ПРИПУСТИМО робити запуск програми)
 +
 ---- ----
-**Даємо ​івенти на nameof** - будь це хоч Margin хоч Context __(Це один з методів реалізування Біндінгів)__+**Бінд кнопки виглядає наступним чином** 
 +<​Code:​csharp>​ 
 +<Button Content="​Click"​ Command="​{Binding StartStopwatch}"​ Width="​100"​ Height="​25"​ HorizontalContentAlignment="​Center"​ Margin="​0,​ 0, 0, -200"></​Button>​ 
 +</​Code>​
  
-Якщо ви імплементуєте інтерфейс **INotifyPropertyChanged**,​ то ви маєте реалізувати **event PropertyChanged**,​ і відправити його кожен раз, коли значення міняється. 
  
 +**Реалізація класу 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>​
----- 
-**Рівень сервісу** __(потрібен для реалізації логіки)__ 
-Цей клас **реалізовує логіку** таймера,​ а саме 
-В конструкторі створюється івент на таймер 
  
-Ця залупа робить логіку йобаного таймера +Якщо ви імплементуєте інтерфейс **INotifyPropertyChanged**, ​то ви маєте реалізувати ​**event PropertyChanged**,​ і відправити його кожен раз, коли значення міняється.
-В конструкторі заборонено робити любу логіку +
-Позволено давати ІВЕНТИ та передавати параметр який заходить в конструктор, в MainWindow  +
-_model.Time = currentTime Заходить в INotifyPropertyChanged і сетить нове ​значення ​рівне currentTime - і таким чином в лейблі ​міняється ​значення+
  
 +----
 +**Рівень сервісу** __(потрібен для реалізації логіки)__
 <​Code:​csharp>​ <​Code:​csharp>​
 namespace CounterSalary.Service namespace CounterSalary.Service
Line 112: Line 153:
 } }
 </​Code>​ </​Code>​
 +
 +
 +Цей клас **реалізовує логіку** таймера,​ а саме
 +В конструкторі створюється івент на таймер
 +_model.Time = currentTime Заходить в INotifyPropertyChanged і сетить нове значення рівне currentTime - і таким чином в лейблі міняється значення
 +
  
 **Пояснення коду нище!**👇 **Пояснення коду нище!**👇