рдЬрдм рд╣рдордиреЗ рд╡рд┐рдВрдбреЛрдЬ 8 рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рд╣рдо рдЗрд╕ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓-рд╡реНрдпреВ-рд╡реНрдпреВрдореЙрдбрд▓ (рдПрдорд╡реАрд╡реАрдПрдо) рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдорд░реНрдерди рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рдереЗред рд╣рдордиреЗ рдПрдХ рдХреА рдЦреЛрдЬ рдореЗрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХреБрдЫ рд╕рдордп рдмрд┐рддрд╛рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рд╣рдордиреЗ рдЗрд╕ рддрдереНрдп рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдХрд┐ рдРрд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЕрднреА рддрдХ рдкреНрд░рдХреГрддрд┐ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЦрд░рд╛рдм рдЦреЛрдЬ рдХреА рд╣реЛ, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ)ред рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм "рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?" рдЦреБрдж рд╕реЗ рдкреВрдЫрд╛ ...

рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдИрд╕реНрдЯрдмреИрдВрдХ рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреАрдЬ рдХреЗ рдЖрдВрддреЛрдВ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдХреЛрдб рдирд╛рдо
EBT.Mvvm )ред рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╡рд┐рдВрдбреЛрдЬ 8 рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдордп рдХреА рдмрдЪрдд рдХрд░рдирд╛ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рд╡рд┐рдХрд╛рд╕, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рдЕрдкрдиреА рдЦреЛрдЬреЛрдВ рдХреЗ рджреМрд░рд╛рди рд╕рд╛рдордирд╛ рдХрд┐рдПред
рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ: рд╣рд░ рдХреЛрдИ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ ViewModel (рд╣рдо рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ) рдФрд░ рдЦреБрдж рдХреЛ рджреЗрдЦреЗрдВ (рджреЗрдЦреЗрдВ) рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХреЛ рдХрдордЬреЛрд░ рдХрд░рдирд╛ рд╣реИред рдЖрджрд░реНрд╢ рд╕реНрдерд┐рддрд┐ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рдХреЛрдб-рдмреИрдХ рджреГрд╢реНрдп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ InitializeComponent рдФрд░, рд╕рдВрднрд╡рддрдГ, рджреГрд╢реНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЛрдб рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ XAML рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдбреЗрд╡рд▓рдкрд░ рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЛ рдкреНрд░рд╕реНрддреБрддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╡рд╣ рдХрд╛рдо рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЬрд┐рдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд▓реЗрдЦ рд╡рд┐рдВрдбреЛрдЬ 8 рдХреЗ рддрд╣рдд C # рдФрд░ XAML рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рд┐рдд рд╣реИред рдиреАрдЪреЗ рд╣рдо рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рддреЛ, рдЪрд▓рд┐рдП рдЪрд▓рддреЗ рд╣реИрдВ:
1. рдмреЗрд╕ рдХреНрд▓рд╛рд╕ ViewModel
MVVM рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╕рдордп рд╢реБрд░реВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкрд╣рд▓реА рдЪреАрдЬ рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╣реИред рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп INOTifyPropertyChanged рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЧреБрдг рдмрджрд▓рдиреЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдлрд╝рдВрдХреНрд╢рдиред рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
public class SimpleViewModel : ViewModel { private int _number; public int Number { get { return _number; } set { OnPropertyChange(ref _number, value); } } }
рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд┐рдирд╛ рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрдиреЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рднрд╛рд░рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рдХрд┐рд╕реА рдХреНрд╖реЗрддреНрд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рднреА рд╣реИред рдпрд╣ рддрдерд╛рдХрдерд┐рдд рдмреИрдХрд┐рдВрдЧ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдКрдкрд░ рдХреЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг _number рдлрд╝реАрд▓реНрдб рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рд╕рдорд░реНрдерди рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЕрдЧрд░ рджреГрд╢реНрдп рдореЙрдбрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдХрдИ рдЧреБрдг рд╣реИрдВред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрдкрддреНрддрд┐ рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рдП (рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред
public string Text { get { return GetPropertyValue(() => Text); } set { SetPropertyValue(() => Text, value); } }
2. рдЯреАрдореЗрдВ
рдПрдХ рдкрд░рд┐рдЪрд┐рдд рдФрд░ рдЖрд╡рд╢реНрдпрдХ RelayCommand рдХрдорд╛рдВрдб рд╣реИрдВрдбрд▓рд░ред рдпрд╣ рдмрдЯрдирдмреЗрд╕ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ (рдмрдЯрди, рдореЗрдиреВ рдЖрдЗрдЯрдо, рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХ) рдХреА рдХрдорд╛рдВрдб рдкреНрд░реЙрдкрд░реНрдЯреА рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ рдФрд░ ICommand рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЕрдкреВрд░рдгреАрдп рдЪреАрдЬ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд▓рд╛рдЧреВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
public class SimpleViewModel : ViewModel { public SimpleViewModel() { SampleCommand = new RelayCommand(OnSample); } public RelayCommand SampleCommand { get; private set; } private void OnSample() {
<Button Command="{Binding SampleCommand}" Content="Button Text" />
3. рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░
рд╣рдордиреЗ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрд╛рдБрдзрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реА рд╣реИред MVVM рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ UI рдЗрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рд╡реНрдпреВ рдореЙрдбрд▓ рдХреА рддрд░рдл рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдереЛрдбрд╝реА рд╕реА рдЪрд╛рд▓ рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡ рдХреА рд╕рдВрд▓рдЧреНрди рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╕реВрдЪреА, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдпрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣рд╛рдВ рдПрдХ рдЯреЗрдХреНрд╕реНрдЯрдмреНрд▓реЙрдХ рддрддреНрд╡ рдХреЗ рдЯреИрдк рдХрд┐рдП рдЧрдП рдЗрд╡реЗрдВрдЯ рдХреА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╣реИ:
public class SimpleViewModel { public SimpleViewModel() { TappedCommand = new EventCommand<Point>(OnTapped); } public IEventCommand TappedCommand { get; private set; } private void OnTapped(Point point) { TappedCommand.PreventBubbling = point.X < 100; } }
<TextBlock Mvvm:EventBinding.Tapped="{Binding TappedCommand}" Text="Tap me"/>
рдпрд╣рд╛рдБ рдпрд╣ TappedCommand.PreventBubbling = point.X <100 рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдордиреЗ рд╕рдВрдмрдВрдзрд┐рдд рдзреНрд╡рдЬ рдХреЛ рд╕реЗрдЯ рдХрд░рдХреЗ рдИрд╡реЗрдВрдЯ (рд╣реИрдВрдбрд▓) рдХреА рдЖрдЧреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХреА рд╣реИред
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдИрд╡реЗрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИ: SelectionChanged, Click, ItemClick, KeyDown, KeyUp, PointerReleased, PointerPressed, PointerMoved, PointerCanceled, Pointernntered, PointerExited, PointerCaptureLost, Tapped, RightTapped, PointerWebw , рднрд░рд╛ рд╣реБрдЖред
4. рд╡рд┐рднрд┐рдиреНрди рд╕реНрдХреНрд░реАрди рдореЛрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ
рд╣рдорд╛рд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рд▓рдХреНрд╖рд┐рдд рдЯреЗрдмрд▓реЗрдЯ-рдЙрдиреНрдореБрдЦ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИ! рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЪрд╛рд░ рд╕реНрдХреНрд░реАрди рдореЛрдб рд╣реИрдВ рдФрд░ рдЙрди рд╕рднреА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕реНрд╡рд░ рд╣реИред рд╡рд░реНрддрдорд╛рди рд╕реНрдХреНрд░реАрди рдореЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рддрдВрддреНрд░ рд╣реИрдВред
- рджреГрд╢реНрдпрддрд╛ рдкреНрд░рдмрдВрдзрдиред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрддреНрд╡ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рд╕рд░рд▓ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
- рд╢реИрд▓реА рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрдиред рдХрднреА-рдХрднреА, рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ рдЬрдЯрд┐рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рддрд░реАрдХрд╛ рд╣реИред
<TextBlock behaviors:OrientationBehavior.Orientations="Landscape,Filled,Portrait" Text="Not snapped"/> <TextBlock behaviors:OrientationBehavior.Orientations="Snapped" Text="Snapped"/>
рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рд╕реНрдХреНрд░реАрди рдореЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реВрдЪреА рдХреЗ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИред
<GridView ItemsSource="{Binding YourItems}"> <behaviors:OrientationBehavior.LandscapeStyle> <Style TargetType="ListViewBase"/> </behaviors:OrientationBehavior.LandscapeStyle> <behaviors:OrientationBehavior.SnappedStyle> <Style TargetType="ListViewBase"> <Style.Setters> <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/> <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Disabled"/> <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> <Setter Property="ScrollViewer.VerticalScrollMode" Value="Auto"/> <Setter Property="ItemsPanel"> <Setter.Value> <ItemsPanelTemplate> <VirtualizingStackPanel Orientation="Vertical"/> </ItemsPanelTemplate> </Setter.Value> </Setter> </Style.Setters> </Style> </behaviors:OrientationBehavior.SnappedStyle> </GridView>
рдПрдХ рддрддреНрд╡ рдХреА рд╢реИрд▓реА рдХреЛ рдмрджрд▓рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
- рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдЯрд╛рдЗрд▓ рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
- рдпрджрд┐ рд╕реНрдХреНрд░реАрди рдореЛрдб рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рд╢реИрд▓реА рдХреЛ рд╕рднреА рдореЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЕрдиреНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рди рд╣реЛрдВред
- рд╕реНрдХреНрд░реАрди рдореЛрдб рдХреЗ рд▓рд┐рдП, рдЗрди рд╢реИрд▓рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЪрд┐рддреНрд░ рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реИрд▓реА рд╣реИ рдФрд░ рддрдбрд╝рдХ рдХреЗ рд▓рд┐рдП рд╣реИ, рддреЛ рдЪрд┐рддреНрд░ рд╢реИрд▓реА рдХреЛ рдкрд░рд┐рджреГрд╢реНрдп рдФрд░ рднрд░реЗ рд╣реБрдП рдореЛрдб рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╢реИрд▓реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕рднреА рдореЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╢реИрд▓реА рдкрд░рд┐рд╡рд░реНрддрди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, ContentControl / ContentPresenter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреГрд╢реНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ! рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ:
<Grid Name="main"> <ContentControl> <behaviors:OrientationBehavior.LandscapeStyle> <Style TargetType="ContentControl"> <Setter Property="ContentTemplate"> <Setter.Value> <DataTemplate> <Grid> <TextBlock Text="Landscape"/> </Grid> </DataTemplate> </Setter.Value> </Setter> </Style> </behaviors:OrientationBehavior.LandscapeStyle> <behaviors:OrientationBehavior.PortraitStyle> <Style TargetType="ContentControl"> <Setter Property="ContentTemplate"> <Setter.Value> <DataTemplate> <Grid> <TextBlock Text="Portrait"/> </Grid> </DataTemplate> </Setter.Value> </Setter> </Style> </behaviors:OrientationBehavior.PortraitStyle> <behaviors:OrientationBehavior.SnappedStyle> <Style TargetType="ContentControl"> <Setter Property="ContentTemplate"> <Setter.Value> <DataTemplate> <Grid> <TextBlock Text="Snapped. Only text here"/> </Grid> </DataTemplate> </Setter.Value> </Setter> </Style> </behaviors:OrientationBehavior.SnappedStyle> </ContentControl> </Grid>
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣, рдЖрдк рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рд╕реНрдиреИрдк рдореЛрдб рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
5. ViewModel рд╕реЗ рджреГрд╢реНрдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛
рдХрднреА-рдХрднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдПрдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рдлрд╝реАрд▓реНрдб рдкрд░ рдЗрдирдкреБрдЯ рдлрд╝реЛрдХрд╕ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ ControlWrapper рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
public class SimpleViewModel : ViewModel { public SimpleViewModel() { TextBoxWrapper = new ControlWrapper(); } public ControlWrapper TextBoxWrapper { get; private set; } public void GotoField() { TextBoxWrapper.Focus(); } }
<TextBox Mvvm:ElementBinder.Wrapper="{Binding TextBoxWrapper}"/>
6. рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рдЗрд╡реЗрдВрдЯ рдЯреНрд░рд┐рдЧрд░
рдпрд╣ рддрдВрддреНрд░ рдЖрдкрдХреЛ рдПрдХ рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рджреГрд╢реНрдп рддрддреНрд╡ рдореЗрдВ рдХреЛрдИ рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдлрд┐рд░, рдХреЛрдб-рдкреАрдЫреЗ рдореЗрдВ рдХреЛрдб рдХреА рдПрдХ рднреА рдкрдВрдХреНрддрд┐ рдирд╣реАрдВ! рд╡рд┐рдзрд┐ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдШрдЯрдирд╛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред XAML рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ TriggerCommand рдХрдорд╛рдВрдб рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
<Grid> <FrameworkElement.Resources> <Storyboard x:Key="FadeOut"> <PointerDownThemeAnimation Storyboard.TargetName="MyElement"/> </Storyboard> <Storyboard x:Key="FadeIn"> <PointerUpThemeAnimation Storyboard.TargetName="MyElement"/> </Storyboard> </FrameworkElement.Resources> <Border x:Name="MyElement" Width="100" Height="100" Background="Red"> <mvvm:EventBinding.PointerPressed> <mvvm:TriggerCommand Storyboard="{StaticResource FadeOut}"/> </mvvm:EventBinding.PointerPressed> <mvvm:EventBinding.PointerReleased> <mvvm:TriggerCommand Storyboard="{StaticResource FadeIn}"/> </mvvm:EventBinding.PointerReleased> </Border> </Grid>
7. рдПрдХ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдмрд╛рдВрдзрдирд╛
ContextMenuBehavior рдЖрдкрдХреЛ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдпрд╛ рдЯрдЪрд╕реНрдХреНрд░реАрди рдкрд░ рдЯреИрдк рдХрд░рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХреЛ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рджреЗрдЦрдиреЗ рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рдЙрд╕ рддрддреНрд╡ рдкрд░ рдПрдХ рдмрдВрдзрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдореЙрдбрд▓ рдореЗрдВ, рдХрдорд╛рдВрдб рдФрд░ рд╣реИрдВрдбрд▓рд░ рдХреА рд╕реВрдЪреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
public class MyViewModel : ViewModel { private IList<UICommand> _contextMenuCommands; private string _text; public string Text { get { return _text; } set { OnPropertyChange(ref _text, value); } } public IList<UICommand> ContextMenuCommands { get { return _contextMenuCommands ?? (_contextMenuCommands = new List<UICommand> { new UICommand("Copy", OnCopy), new UICommand("Paste", OnPaste), }); } } private void OnCopy(IUICommand command) { var content = new DataPackage(); content.SetText(Text); Clipboard.SetContent(content); } private async void OnPaste(IUICommand command) { var content = Clipboard.GetContent(); Text = await content.GetTextAsync(); } }
<TextBlock behaviors:ContextMenuBehavior.Commands="{Binding ContextMenuCommands}" Text="{Binding Text}" MinWidth="300" Height="40"/>

8. рд╕реНрдиреИрдк рдкреЙрдкрдЕрдк
рдЬрдм рдЖрдк рд╕рд╣реА рдорд╛рдЙрд╕ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЯрдЪрд╕реНрдХреНрд░реАрди рдкрд░ рдЯреИрдк рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреЙрдкрдЕрдк рдкреНрд░рджрд░реНрд╢рди рдЖрдкрдХреЛ рдкреЙрдкрдЕрдк рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
<TextBlock Text="Tap or right click here for more information" behaviors:PopupBehavior.Placement="Above"> <behaviors:PopupBehavior.Content> <DataTemplate> <TextBlock Text="More information..."/> </DataTemplate> </behaviors:PopupBehavior.Content> </TextBlock>

9. рдЕрдВрддрд░рд╛рд▓реАрдп рдиреЗрд╡рд┐рдЧреЗрд╢рди
рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкреГрд╖реНрда рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╣реИ - рдпрд╣ рдХреЛрдб-рдкреАрдЫреЗ рдХреА рд╢реБрджреНрдзрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдЕрдЧрд░ рдХреЙрд▓ рд╡реНрдпреВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрдХреНрд░рдордг рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рджреГрд╢реНрдп рдореЙрдбрд▓ рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдФрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХрд╛ рдореБрдЦреНрдп рдореЙрдбрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ:
public class RootModel { public RootModel() { NavigationState = new NavigationState(); HomePageModel = new HomePageModel(this); } public NavigationState NavigationState { get; set; } public HomePageModel HomePageModel { get; set; } public bool CanGoBack { get { return NavigationState.CanGoBack; } } public void GoBack() { NavigationState.GoBack(); } public void GoToHomePage() { NavigationState.Navigate(typeof (HomePage)); } }
рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдореБрдЦреНрдп рдореЙрдбрд▓ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рджреГрд╢реНрдп рдЯреНрд░реА рдХреЗ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рддрддреНрд╡ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рдирд╕реНрдЯреНрд░реАрдо рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рдХреЛ рдлреНрд░реЗрдо рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
sealed partial class App : Application { ... public RootModel RootModel { get; private set; } protected override void OnLaunched(LaunchActivatedEventArgs args) { RootModel = new RootModel(); var frame = new Frame { DataContext = RootModel };
рдЕрдм рд╣рдорд╛рд░рд╛ HomePageModel рд╡реНрдпреВ рдореЙрдбрд▓ OnNavigating рдФрд░ OnNavigated рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░ _rootModel рдкрд░ рд╕рд╣реЗрдЬреЗ рдЧрдП рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреНрдп рдкреГрд╖реНрдареЛрдВ рдкрд░ рднреА рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ OnNavigating рд╕рдВрдХреНрд░рдордг рд░рджреНрджреАрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ (рд░реЗрдл рдмреВрд▓ рд░рджреНрдж рдкреИрд░рд╛рдореАрдЯрд░)ред
public class HomePageModel : PageModel
XAML рдореЗрдВ, рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рд╣реА DataContext рдкреЗрдЬ рд╕реЗрдЯ рдХрд░реЗрдВред
<Page x:Class="YourNamespace.HomePage" ... DataContext="{Binding HomePageModel}"> </Page>
рд╕рдм рдХреБрдЫ, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИред рдЕрдм рдЖрдк рдкреГрд╖реНрда рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз OnNavigating рдФрд░ OnNavigated рдШрдЯрдирд╛рдУрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ред
10. рдХрдВрдХрд╛рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдЦрд╛рдХрд╛
рд╣рдордиреЗ рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рд╣реИ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рд╕реНрдЯреЛрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдСрдирд▓рд╛рдЗрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИред

рдЕрднреА рдХреЗ рд▓рд┐рдП
рдЦреИрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд╣рд╛рдБ рднреА рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕, рдмрдЪрдд рдФрд░ рдмрд╣рд╛рд▓ рд░рд╛рдЬреНрдп, рдЖрдХрд░реНрд╖рдг-рдкреИрдирд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рд╣реИрдВред рд╣реИрдмреНрд░рд┐рдЯрд╛рдЯреЗрд▓реА рдмрд╛рдХреА рдХреЛ рд╕реАрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд╕реАрдзреЗ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рддреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдЧрд▓реЗ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВ:
рдореИрдВ рдЗрд╕реЗ рдХрд╣рд╛рдВ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
рдЗрдЪреНрдЫреБрдХ рдЖрд╡рд╛рд╕рдХрд░реНрддрд╛ рд╡рд░реНрдгрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдпрд╣ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд╣рдорд╛рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА
Nuget рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ
рдХреЛрдбрдкреНрд▓реЗрдХреНрд╕ рдкрд░ рднреА рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рдЯреВрд▓-> рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдФрд░ рдЕрдкрдбреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 12 рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдЦреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдСрдирд▓рд╛рдЗрди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдЦреЛрдЬ рдкрдЯреНрдЯреА рдореЗрдВ
рд╡рд┐рдВрдбреЛрдЬ 8 рдПрдорд╡реАрд╡реАрдПрдо рдХреАрд╡рд░реНрдб рдЯрд╛рдЗрдк рдХрд░реЗрдВред

рдЕрдВрдд рдореЗрдВ
"EBT.Mvvm рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ" рдЬреИрд╕рд╛ рд╣реИ "рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдбреЗрд╡рд▓рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдирд╣реАрдВ рд╣реИ ..."
рд▓реЗрдХрд┐рди рдЧрдВрднреАрд░рддрд╛ рд╕реЗ, рд╣рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рд╣рдорд╛рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдпреБрд╡рд╛ рд╡рд┐рдВрдбреЛрдЬ 8 рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдорджрдж рдХрд░рддреА рд╣реИ рдЬреЛ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рдХрд╛рдмреВ рдкрд╛рдиреЗ рдореЗрдВ рд╕рдордп рдмрдЪрд╛рддреА рд╣реИ рдЬреЛ рд╣рдо рдЦреБрдж рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рд╣рдорд╛рд░реА рдХреНрд╖рдорддрд╛ рдФрд░ рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд╕реБрдзрд╛рд░ рдФрд░ рд╕реБрдзрд╛рд░ рд░рд╣реЗ рд╣реИрдВред рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИрдВред
рдореИрдВ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЖрдЗрдП рд╡рд┐рдВрдбреЛрдЬ рд╕реНрдЯреЛрд░ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ!