
рдбреЗрд╕реНрдХрдЯреЙрдк WPF-MVVM рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкреГрд╖реНрда рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рдлреА рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рд╣реИред
рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЧрд╛рдЗрдб рд╣реИрдВред
рдФрд░ , рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╣реИрдмреНрд░рд╛рд╣ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИ (
рдПрдХ рдмрд╛рд░ рдФрд░
рджреЛ рдмрд╛рд░ рд▓реЗрдЦ рд╣реИрдВ)ред
рдкрд╣рд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЖрдк
рдиреЗрд╡реАрдЧреЗрд╢рди рд╕рд░реНрд╡рд┐рд╕ рдФрд░
рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗрдВрдЧреЗред
рдпрджрд┐ рдЖрдк рджреВрд╕рд░реЗ рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рддрдерд╛рдХрдерд┐рдд "рдХреЛрдб рдмрд┐рд╣рд╛рдЗрдВрдб" рдореЗрдВ
рдиреЗрд╡рд┐рдЧреЗрд╢рдирд╕рд░реНрд╡рд┐рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реАрдЦреЗрдВрдЧреЗред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдЗрди рд▓реЗрдЦреЛрдВ рдореЗрдВ (рдореЗрд░реА рд░рд╛рдп рдореЗрдВ) рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдПрдХреНрд╕ рдЧреИрдк рдХреЛ рднрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╕рдорд╛рдзрд╛рдиред
рдФрд░ рдореИрдВ рдкреЗрдЬ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдШрдЯрдХ рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ред
рдореИрдВ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ, рд╕реБрдзрд╛рд░реЛрдВ рдФрд░ рдкрд░рд┐рд╡рд░реНрдзрди рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА
рд╣реВрдВ ред
рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдХреЛрдИ рдирд╛рд╡рд┐рдХ рдХреЗ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЙрдкрдпреЛрдЧреА рдкрд╛рдПрдЧрд╛ред
рдкрд░рд┐рдЪрдп
рд╣рд░ рдХреЛрдИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА WPF рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рдЪреБрдХрд╛ рд╣реИ, рд╡рд╣ рд╢рд╛рдпрдж MVVM рдкреИрдЯрд░реНрди (рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ) рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдПрдорд╡реАрд╡реАрдПрдо рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реАрдзреА рд╣реИ рдФрд░, рдХрдо рд╕реЗ рдХрдо, рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд╛рдн рдХреЛ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕реНрд╡рдпрдВ рдХреЛ рдЗрд╕рдХреА рд╕рднреА рдорд╣рд┐рдорд╛рдУрдВ рдореЗрдВ рджрд┐рдЦрд╛рдП, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рдпрдВрддреНрд░рдг (UserControl) рдХреЗ "рдХреЛрдб рдмрд┐рд╣рд╛рдЗрдВрдб" рдореЗрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрдо рддрд░реНрдХ рд░рдЦреЗрдВ рдФрд░ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ ViewModel рдХреЗ рдЕрдВрджрд░ UI рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рдЕрд▓рдЧ ViewModel рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рд▓рд╛рдн рджреЗрдЧрд╛ред рдПрдХ рдФрд░ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╕реАрдзреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ ViewModel рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдареАрдХ рд╣реИ рдЕрдЧрд░ рдирд┐рдпрдВрддреНрд░рдг рдЦреБрдж рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ ViewModel рдмрдирд╛рддрд╛ рд╣реИ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░реАрдХреНрд╖рдг рдЧреБрдбрд╝рд┐рдпрд╛ рдбрд╛рд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рдЪреАрдЬреЗрдВ рддрдм рд╣реЛрдВрдЧреА рдЬрдм рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрднрд┐рднрд╛рд╡рдХ рдирд┐рдпрдВрддреНрд░рдг рдмрд╛рдХреА рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП ViewModels рдмрдирд╛рдиреЗ рдореЗрдВ рд╡реНрдпрд╕реНрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддрдм рдХреЛрдб рд╕реНрдкреЗрдЧреЗрдЯреА рдХреЗ рдПрдХ рдЕрд╕реНрдерд┐рд░ рдЧреБрдЪреНрдЫрд╛ рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЕрдиреНрдп ViewModels ViewModels рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред
рдЖрдЗрдП рдПрдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░, рдХрдИ рд╕реНрдХреНрд░реАрди рдФрд░ рдбрд╛рдпрд▓реЙрдЧ рдмреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╣рдо рдХрдИ рдЗрдХрд╛рдЗрдпрд╛рдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ: рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ, рдмрдЯрди рдХреЗ рд╕рд╛рде рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░, рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдФрд░ рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рдКрдкрд░ рд╕рдВрд╡рд╛рджред рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ, рд╣рдо рдкреЗрдЬрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрдЬрд╛рдп рдмрдЯрди рдХреЗ рдмрдЬрд╛рдп рд╕рд╛рдордЧреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдЯреЗрдХреНрд╕реНрдЯрдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХ рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдЬреЛ рдлрд╝реНрд░реЗрдо рдХреЗ рдирд╛рдо рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирдП рдкреГрд╖реНрда рдкрд░ рдХреВрджрдирд╛ рд╣реИред рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рдЗрдкрд░рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рдВрдЫрд┐рдд ViewModel рдХреЛ рдкреЗрдЬ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдиреЗрдЯ рдкрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХреБрдЫ рд╣рд▓ рджреЗрдЦреЗ:
- рдХреЛрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдВрдбреЛ рдореЗрдВ рдлрд╝реНрд░реЗрдо.рдирдПрд╡реАрдЧреЗрдЯреЗрдб рдЗрд╡реЗрдВрдЯ рдореЗрдВ, рдЖрдк рдлрд╝реНрд░реЗрдо рдореЗрдВ рд▓реЛрдб рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдХреЛрдб рд╡реНрдпреВ рд╡реНрдпреВрд╣реЗрд▓ рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдХреЛрдб рд╕реЗ рдЗрд╕реЗ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП ViewModels рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдПрдХ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдЧрд╛ ... рдФрд░ рдпрджрд┐ ... рдпрд╛ рд╕реНрд╡рд┐рдЪред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ "рд╣рд╛рд░реНрдб рдХреЛрдбреЗрдб" рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдореИрдВ рдЪреБрдк рд╣реВрдВред
- рдПрдХ рдЕрдиреНрдп рдЙрдкрд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рддрд╣рдд рдкреЗрдЬ рдФрд░ ViewModel рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛рдП, PageM рдХреЗ DataContext рдореЗрдВ ViewModel рдХреЛ рдПрдореНрдмреЗрдб рдХрд░реЗрдВ рдФрд░ рдмрдирд╛рдП рдЧрдП рдкреЗрдЬ рдХреЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рдлрд╝реНрд░реЗрдо рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдВ рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВред рдпрд╣ рд╕рдорд╛рдзрд╛рди рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рд╕рднреА "рдПрдорд╡реАрд╡реАрдПрдо-рд╡реЗ" рдирд╣реАрдВ рд╣реИред
- рддреАрд╕рд░рд╛ рд╕рдорд╛рдзрд╛рди PRISM рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рд╕рдордЧреНрд░ рдпреВрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рдЙрджреНрдпрдо рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк AngularJS рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИред рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд╖реЗрддреНрд░ рдкреНрд░рдмрдВрдзрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ UI рдХреЗ рдХреБрдЫ рднрд╛рдЧ рдкрдВрдЬреАрдХреГрдд рд╣реЛрддреЗ рд╣реИрдВред рдлрд┐рд░, рдмрдирд╛рдП рдЧрдП рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЙрдкрдирд╛рдо рджреНрд╡рд╛рд░рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╕рдВрджрд░реНрдн рдХрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рднреАред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЙрд╕реА рддрд░рд╣ рдХреА рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдиреЗрд╡реАрдЧреЗрд╢рди рд╕рд░реНрд╡рд┐рд╕ WPF рдореЗрдВ рд▓рд╛рдЧреВ рд╣реИред
рдкрд╣рд▓реЗ рджреЛ рдирд┐рд░реНрдгрдп рдПрдХ рд╕реНрдкрд╖реНрдЯ рдмреИрд╕рд╛рдЦреА рд╣реИрдВред PRISM рдПрдХ рд╕рдВрдкреВрд░реНрдг UI рд╕рдВрд░рдЪрдирд╛ рд╣реИред рдмреЗрд╢рдХ, рдЗрд╕рдХреЗ рдЕрдзреНрдпрдпрди рдореЗрдВ рдирд┐рд╡реЗрд╢ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЫреЛрдЯреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг) рдХреЗ рд▓рд┐рдП, рдЖрдИрдУрд╕реА рдФрд░ рдкреАрдЖрд░рдЖрдИрдПрд╕рдПрдо рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдПрдорд╡реАрд╡реАрдПрдо рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреМрди рд╕рд╛ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдлрд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдореЗрдВ рдкреЗрдЬ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ OnNavigatedTo рдУрд╡рд░рд▓реЛрдб рд╡рд┐рдзрд┐ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ, рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП ViewModel рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдВ (Uri uri, рдСрдмреНрдЬреЗрдХреНрдЯ рдиреЗрд╡рд┐рдЧреЗрд╢рдирдХрдиреЗрдХреНрдЯ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, WPF рдореЗрдВ, рдкреЗрдЬ рдирд╣реАрдВ рд╣реИред рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рдпрд╣ рдпрд╛ рдЗрд╕рдХреЗ рд╕рдордХрдХреНрд╖ рдХреБрдЫ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рд╣рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдордзреНрдпрд╕реНрде рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдПрдХ рдкреНрд░рдмрдВрдзрдХ рдЬреЛ рдкреЗрдЬ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╡реНрдпреВрдореЙрдбрд▓ рдХреЛ рд╡рд┐рдзрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ DataContext рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВ рдореБрдЦреНрдп рд╕рдорд╛рдзрд╛рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛, рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреНрд░рдмрдВрдзрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдлрд┐рд░, рд╣рдо рдпреВрдЖрдИ рдФрд░ рд╡реНрдпреВрдореЙрдбрд▓ рдкрд░рддреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рд╕рдордп рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк "рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреНрд░рдмрдВрдзрдХ" рдЕрдиреБрднрд╛рдЧ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдмрд╛рдХреА рдХреЛ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВред
рдХреЛрдИ рднреА рдХреЛрдб рдХреЛ рддреБрд░рдВрдд рджреЗрдЦрдиреЗ рдХрд╛ рдЗрдЪреНрдЫреБрдХ рд╡реНрдпрдХреНрддрд┐
GitHub рдХреЗ
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреНрд░рдмрдВрдзрдХ
рдпрд╣ рдкреНрд░рдмрдВрдзрдХ рдПрдХ рдПрдХрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрд╢рдХреНрдд (рддрдерд╛рдХрдерд┐рдд
рдбрдмрд▓-рдЪреЗрдХ рд▓реЙрдХрд┐рдВрдЧ рд╕рд┐рдВрдЧрд▓рдЯрди ,
рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╕рдВрд╕реНрдХрд░рдг) рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИред рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рд▓рд┐рдП рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рдЖрдкрдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб рдиреАрдЪреЗ рджреЗрдЦреЗрдВред
рдПрдХрд╛рдХреА рд╡рд╕реНрддреБ#region Singleton private static volatile Navigation instance; private static object syncRoot = new Object(); private Navigation() { } private static Navigation Instance { get { if (instance == null) { lock (syncRoot) { if (instance == null) instance = new Navigation(); } } return instance; } } #endregion
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВрдиреЗ
рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдирд┐рдЬреА рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИред рдпрд╣ рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреБрдЫ рднреА рдХрдо рди рджрд┐рдЦреЗред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╕рд┐рдВрдЧрд▓рдЯрди рдЙрджрд╛рд╣рд░рдг рдХреА рдирд┐рдЬреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВрдиреЗ рд╕реЗрд╡рд╛ рдиреЗрд╡рд┐рдЧреЗрд╢рди
рд╕реЗрд╡рд╛ (рдЬреИрд╕реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди
рд╕реЗрд╡рд╛ ) рдХреА рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рдИ, рдЬреЛ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдирд┐рдЬреА рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреА рд╣реИред рдпрд╣ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдмрд╛рд╣рд░ рд╕реЗ рд╕рднреА рдХреЙрд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рддред
Navigation.Instance.Service
рдХреЗ рдмрдЬрд╛рдп
Navigation.Service
рд╡рд╣ рд╡рд┐рдХрд▓реНрдк рдЪреБрдиреЗрдВ рдЬреЛ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рд╡рд┐рдХрд▓реНрдк рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реНрдереИрддрд┐рдХ рдЧреБрдгреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕рдВрдкрддреНрддрд┐ (рдиреЗрд╡рд┐рдЧреЗрд╢рди.рдЗрдирд╕реНрдЯрд╛рдВрд╕) рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд▓рд╛рднрджрд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рд╕рд┐рдВрдЧрд▓рдЯрди рдореЗрдВ
рд╕реЗрд╡рд╛ рдЧреБрдг рдлрд╝реНрд░реЗрдо рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ
рдиреЗрд╡реАрдЧреЗрд╢рди рд╕рд░реНрд╡рд┐рд╕ рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдкреЗрдЬ рдЯреНрд░рд╛рдВрдЬрд╝рд┐рд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЖрдк рдЗрд╕ рд▓рд┐рдВрдХ рдХреЗ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк (рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ
рд▓реЛрдб рдХрд┐рдП рдЧрдП рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ) рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдХреНрд╖рдг рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг public MainWindow() { InitializeComponent(); Loaded += MainWindow_Loaded; } void MainWindow_Loaded(object sender, RoutedEventArgs e) { Navigation.Navigation.Service = MainFrame.NavigationService; DataContext = new MainViewModel(new ViewModelsResolver()); }
рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рдХреЛ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рд╕рд░реНрд╡рд┐рд╕ рдлреНрд░реЗрдо рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ рдмрдЬрд╛рдп, рдХреЛрдИ рднреА рдирд┐рдпрдВрддреНрд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдг рдХреА рд▓реЛрдб рдХреА рдЧрдИ рдШрдЯрдирд╛ рдореЗрдВ рдиреЗрд╡реАрдЧреЗрд╢рди рд╕рд░реНрд╡рд┐рд╕ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдШрдЯрдирд╛ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк
рдЕрд╢рдХреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рдиреЗрд╡реАрдЧреЗрд╢рди рд╕рд░реНрд╡рд┐рд╕ рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЕрдзреНрдпрдпрди рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ
WPF рдЯреВрд▓рдХрд┐рдЯ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реЗ рдЪрд╛рдЗрд▓реНрдбрд╡рд┐рдВрдбреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдФрд░ рдлреНрд░реЗрдо рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдВрд╡рд╛рдж рдХреЗ рдЕрдВрджрд░ рд╕рдВрдХреНрд░рдордг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рдореЗрдВ рдиреЗрд╡реАрдЧреЗрд╢рди рд╕рд░реНрд╡рд┐рд╕ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдХреНрд░реАрди рдХреЗ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдмрд╛рдЗрдВрдбрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╡рд╛рдж рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рджреГрд╢реНрдп рдмрд╣реБрдд рд╣реА рд╡рд┐рджреЗрд╢реА рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдкреЗрдВрдЯ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдпрджрд┐ рдРрд╕рд╛ рдкрд░рд┐рджреГрд╢реНрдп рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдореИрдВ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рд▓рд┐рдЦреВрдВрдЧрд╛ред
рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдкреНрд░рдмрдВрдзрдХ рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ рдХреЛ рдПрдХ рдирдпрд╛ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕реЗрд╡рд╛ рдХреЗ рд╕реЗрдЯрд░ рдореЗрдВ, рдПрдХ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдФрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХреА рдЧрдИ рд╕реЗрд╡рд╛ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рджрд╕реНрдпрддрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред
рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕реЗрд╡рд╛ рд╕рдВрдкрддреНрддрд┐ public static NavigationService Service { get { return Instance._navService; } set { if (Instance._navService != null) { Instance._navService.Navigated -= Instance._navService_Navigated; } Instance._navService = value; Instance._navService.Navigated += Instance._navService_Navigated; } }
рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ, рд╕реЗрдЯрд░ рдореЗрдВ
рд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ (рдФрд░ рдкрдмреНрд▓рд┐рдХ рдореИрдиреЗрдЬрд░ рдХреЗ рддрд░реАрдХреЗ рднреА)ред рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрджрд┐ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ
рдиреЗрд╡реАрдЧреЗрд╢рди рд╕рд░реНрд╡рд┐рд╕ рдХреА рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд┐рдирд╛
рд▓реЙрдХ рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреА рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВред
рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рддрд░реАрдХреЗ #region Public Methods public static void Navigate(Page page, object context) { if (Instance._navService == null || page == null) { return; } Instance._navService.Navigate(page, context); } public static void Navigate(Page page) { Navigate(page, null); } public static void Navigate(string uri, object context) { if (Instance._navService == null || uri == null) { return; } var page = Instance._resolver.GetPageInstance(uri); Navigate(page, context); } public static void Navigate(string uri) { Navigate(uri, null); } #endregion
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ, рдЖрдк "
_resolver " рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред IoC рд╕реЗрдХреНрд╢рди рдореЗрдВ, рдореИрдВ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ,
рдХрдиреНрдЯреЗрдирд░ рдСрдл рдХрдВрдЯреНрд░реЛрд▓ рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдирд░ рдХрд╛ рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
рдиреЗрд╡рд┐рдЧреЗрд╢рди рдкреНрд░рдмрдВрдзрдХ рдиреЗрд╡рд┐рдЧреЗрд╢рдирд╕реН рд╕реЗрд╡рд╛ рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рдмрд╕реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рд▓реИрдВрдбрд┐рдВрдЧ рдкреГрд╖реНрда рдХреЗ
DataContext рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд ViewModel рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдпрд╣
рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд┐рдП рдЧрдП рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдиреАрдЪреЗ рдХреЛрдб рджреЗрдЦреЗрдВ)ред
рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд┐рдП рдЧрдП рдИрд╡реЗрдВрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ #region Private Methods void _navService_Navigated(object sender, NavigationEventArgs e) { var page = e.Content as Page; if (page == null) { return; } page.DataContext = e.ExtraData; } #endregion
рдлрд╝реНрд░реЗрдо рдкреНрд░рдХрд╛рд░ рдХреЛ
рдкреГрд╖реНрда рдкреНрд░рдХрд╛рд░ рдкрд░ рдХрд╛рд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд┐рдП рдЧрдП рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЗрд╡рд▓ рдкреЗрдЬ рдкрд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдмрджрд▓рд╛рд╡реЛрдВ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд╛рдПрдЧреАред рдЕрдиреНрдп рд╕рднреА рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЗрд╕ "рд▓реЛрд╣реЗ рдХреЗ рдкрд░реНрджреЗ" рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдлрд▓ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдШрдЯрдирд╛ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдПрдХреНрд╕реНрдЯреНрд░рд╛рдбреЗрдЯрд╛ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдкрд╛рд░рд┐рдд ViewModel рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд▓реИрдВрдбрд┐рдВрдЧ рдкреГрд╖реНрда рдХреЗ DataContext рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореИрдиреЗрдЬрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред
рдпрд╣ рдкрдиреНрдиреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ ViewModel'ey рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдореИрдВрдиреЗ рд╣реЗрд▓реНрдкрд░реНрд╕ рдЕрд╕реЗрдВрдмрд▓реА рднреА рд▓рд╛рдЧреВ рдХреА, рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ ViewModel
рдХреЗ рд▓рд┐рдП
RelayCommand рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдХреЛрдб рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рддрд╛рдХрдд рдФрд░ рд╕рдордп рд╣реИ, рддреЛ UI рдФрд░ ViewModel рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЕрдЧрд▓реЗ рдЕрдиреБрднрд╛рдЧреЛрдВ рдкрд░ рдЬрд╛рдПрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдХреА рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдФрд░ рдХреНрдпрд╛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд▓рдЧ ViewModel рдмрдирд╛рдПрдВред рдпреЗ "рдирд┐рдЬреА" ViewModels "
рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╡реНрдпреБрддреНрдХреНрд░рдо " (
IoC рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдореВрд▓
MainViewModel рдореЗрдВ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЦреНрдп ViewModel рдХреЛ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ DataContext рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕реА рд╕рдлрд▓рддрд╛ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рдВрд╕рд╛рдзрди рд╡рд┐рдВрдбреЛ рдореЗрдВ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрддрд░ рдкрд░ рдПрдХ рд╕реНрдерд┐рд░ XAML рд╕рдВрд╕рд╛рдзрди рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрд╕реНрдЯреИрдВрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ DataContext рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд░реНрд╕ рдореЗрдВ Source = {StaticResource MainViewModelDataSourceKey} рдЬреИрд╕рд╛ рдХреБрдЫ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рддрд╛рд░реНрдХрд┐рдХ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ DataContext рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
MainViewModel рдореЗрдВ, рдореИрдВрдиреЗ рдХрдИ рдХрдорд╛рдВрдб рдмрдирд╛рдПред
CommandParameter рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреГрд╖реНрда рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЙрдкрдирд╛рдо рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ (рдбреЗрдЯрд╛ рд╕рдВрджрд░реНрдн рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдирд╛)ред рдЕрдиреНрдп рдЖрджреЗрд╢реЛрдВ рдореЗрдВ, рдЙрдирдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдореЗрдВ,
рдХрдорд╛рдВрдбрдкреИрд░рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд
рдбреЗрдЯрд╛ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рд▓реИрдВрдбрд┐рдВрдЧ рдкреГрд╖реНрда рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдирд╛рдо рдХреЗ рд▓рд┐рдП рдЫрд▓рд╛рдВрдЧ рд╣реИред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк
рдЧрд┐рдЯрд╣рдм рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред
ViewModels рд╡рд┐рдзрд╛рдирд╕рднрд╛
рдпрд╣ рдЕрд╕реЗрдВрдмрд▓реА ViewModel рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреА рд╣реИ, рдЬреЛ
INotifyPropertyChanged рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред
BaseViewModel public class BaseViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void RaisePropertyChanged(string propertyName) { if (string.IsNullOrWhiteSpace(propertyName)) { return; } if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }
рд╢реЗрд╖ ViewModels рдЗрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИред рд╡реЗ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрдкрддреНрддрд┐ рд░рдЦрддреЗ рд╣реИрдВ (рдиреАрдЪреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ)ред
public class Page1ViewModel : BaseViewModel { public string Page1Text { get { return "Hello, world!\nSent from my iPage 1..."; } } }
рдЯрд┐рдкреНрдкрдгреАрдпрд╣рд╛рдБ рдиреЛрдЯрд┐рд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдФрд░ рдмрд┐рдирд╛ RaisePropertyChanged (...) рдХреЛ рдХреЙрд▓ рдХрд┐рдП рдмрд┐рдирд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, ViewModels рдХреЗ рдРрд╕реЗ рдЧреБрдг рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕реЗ рдЧреБрдгреЛрдВ рдкрд░ рдмрдВрдзрди рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдореИрдВ RaisePropertyChanged (...) рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕реЗрдЯрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рддреЛ рднреА рдмрдВрдзрди "рдПрдХ рдмрд╛рд░" рд╣реЛрдЧрд╛ред
MainViewModel рдкрд╣рд▓реЗ
рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛, рдпрд╣ рдирд┐рдЬреА ViewModels рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХрдорд╛рдВрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рдЬреА ViewModels рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рддрдерд╛рдХрдерд┐рдд "
рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ " рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм MainViewModel рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЗрди ViewModels рдХреЗ рдЧреЗрдЯрд░реНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред
public Page1ViewModel Page1ViewModel { get { return _p1ViewModel; } } public Page2ViewModel Page2ViewModel { get { return _p2ViewModel; } } public Page3ViewModel Page3ViewModel { get { return _p3ViewModel; } }
рдлрд╝реАрд▓реНрдб MainViewModel рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдЖрд░рдВрднреАрдХреГрдд рд╣реИрдВ:
_p1ViewModel = _resolver.GetViewModelInstance(Page1ViewModelAlias); _p2ViewModel = _resolver.GetViewModelInstance(Page2ViewModelAlias); _p3ViewModel = _resolver.GetViewModelInstance(Page3ViewModelAlias);
рдЯрд┐рдкреНрдкрдгреАрдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ " _resolver " рдкреНрд░рдмрдВрдзрди рдХреЗ рд╡реНрдпреБрддреНрдХреНрд░рдо рдХрд╛ рдПрдХ рдФрд░ рдХрдВрдЯреЗрдирд░ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред рдлрд┐рд▓рд╣рд╛рд▓, рдпрд╣ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЗрд╡рд▓ рдЙрд╕ рдЙрдкрдирд╛рдо рд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдирд┐рдХрд╛рд▓ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдкрд╛рд░рд┐рдд рдЙрд░реНрдл тАЛтАЛрд╡реНрдпреВрдореЙрдбрд▓ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЖрдкрдХреЛ рдирд┐рдЬреА ViewModels рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдФрд░ рдЧреБрдгреЛрдВ рдХрд╛ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рд╛рдердорд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдорд╛рдВрдб рдХреЛ рд▓рд╛рдЧреВ рдФрд░
рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдЖрд░рдВрдн рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдорд╛рдВрдб рд╕реЗрдЯрд░ рд╣реЛрдиреЗ рд╕реЗ рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди ViewModel рдХреЗ рдмрд╛рд╣рд░ рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ "рдУрдХреЗ" рдмрдЯрди рдХреЗ рдХреНрд▓рд┐рдХ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреЗ (рдбрд╛рдпрд▓реЙрдЧ) рдЖрдВрддрд░рд┐рдХ рд╡реНрдпреВрдореЙрдбрд▓ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдХрдорд╛рдВрдб рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрд░рд╣ рдХрд╛ рдкрд░рд┐рджреГрд╢реНрдп рдмрд╣реБрдд рд╣реА рд╡рд┐рдЪрд┐рддреНрд░ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЯреАрдо рдХреЗ рдирд┐рд╡рд╛рд╕рд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЯреАрдо рдХрд╛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди public ICommand GoToPathCommand { get { return _goToPathCommand; } set { _goToPathCommand = value; RaisePropertyChanged("GoToPathCommand"); } } public ICommand GoToPage1Command { get { return _goToPage1Command; } set { _goToPage1Command = value; RaisePropertyChanged("GoToPage1Command"); } } private void InitializeCommands() { GoToPathCommand = new RelayCommand<string>(GoToPathCommandExecute); GoToPage1Command = new RelayCommand<Page1ViewModel>(GoToPage1CommandExecute); GoToPage2Command = new RelayCommand<Page2ViewModel>(GoToPage2CommandExecute); GoToPage3Command = new RelayCommand<Page3ViewModel>(GoToPage3CommandExecute); } private void GoToPathCommandExecute(string path) { if (string.IsNullOrWhiteSpace(path)) { return; } var uri = new Uri(path); Navigation.Navigate(uri); } private void GoToPage1CommandExecute(Page1ViewModel viewModel) { Navigation.Navigate(Navigation.Page1Alias, Page1ViewModel); }
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд▓реИрдВрдбрд┐рдВрдЧ рдкреГрд╖реНрда рдХрд╛ рдЙрдкрдирд╛рдо рдорд╛рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрди рдПрд▓рд┐рдпрд╛рд╕реЗрд╕ рдХреЛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореИрдиреЗрдЬрд░ рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрд╛, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ XML рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╛рда рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рд╣реИред
GoToPage1Command рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж,
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЙрдкрдирд╛рдо рджреНрд╡рд╛рд░рд╛ рдкреГрд╖реНрда рдкрд░
рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░
Page1ViewModel рдХрд╛ рд▓рд┐рдВрдХ рдкреЗрдЬ рдХреЗ DataContext рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рд▓реИрдВрдбрд┐рдВрдЧ рдкреГрд╖реНрда рд╕реЗ рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ MainViewModel рдХреЗ рдЕрдВрджрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗред
рд╕рдм рдХреБрдЫ ViewModels рдХреЗ рд╕рд╛рде рд╣реЛрдиреЗ рд▓рдЧрддрд╛ рд╣реИред рд╣рдо рдпреВрдЖрдИ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдФрд░ рдкреЗрдЬ рдЕрд╕реЗрдВрдмрд▓реА
рдореБрдЭреЗ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЖрд╡реЗрджрди рджреЗрдВред

рдмрд╛рдИрдВ рдУрд░ рдЪрд╛рд░ рдмрдЯрди рд╣реИрдВред рдкрд╣рд▓рд╛ рдмрдЯрди GoToPathCommand рдХрдорд╛рдВрдб рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдПрдХ рдбреЗрдЯрд╛ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛ Page1 рдХреЗ рд▓рд┐рдП рдХреВрджрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, ViewModel рд╕реЗ рд╡рд░реНрддрдорд╛рди рдорд╛рди рдХреЛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ FallbackValue рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдорд╛рди рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╢реЗрд╖ рдмрдЯрди рдХрдорд╛рдВрдб рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрд╡рд╢реНрдпрдХ рдкреГрд╖реНрда рдкреГрд╖реНрда рдХреЗ рдЙрдкрдирд╛рдо рдХреЗ рд╕рд╛рде "рдирд┐рдЬреА" рдХрдорд╛рдВрдб рд╕реЗ рдмрдВрдзреЗ рд╣реИрдВред
рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХрд╛ рд▓реЗрдЖрдЙрдЯ рдФрд░ рдХреЛрдб <Window x:Class="Navigator.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="480" Width="640"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition /> </Grid.ColumnDefinitions> <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Hidden"> <StackPanel> <Button Content="P 1 w/o data" Command="{Binding GoToPathCommand}" CommandParameter="pack://application:,,,/Pages;component/Page1.xaml"/> <Button Content="Page 1" Command="{Binding GoToPage1Command}" CommandParameter="{Binding Page1ViewModel}"/> <Button Content="Page 2" Command="{Binding GoToPage2Command}" CommandParameter="{Binding Page2ViewModel}"/> <Button Content="Page 3" Command="{Binding GoToPage3Command}" CommandParameter="{Binding Page3ViewModel}"/> </StackPanel> </ScrollViewer> <Frame x:Name="MainFrame" Grid.Column="1" Background="#CCCCCC"/> </Grid> </Window>
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Loaded += MainWindow_Loaded; } void MainWindow_Loaded(object sender, RoutedEventArgs e) { Navigation.Service = MainFrame.NavigationService; DataContext = new MainViewModel(); } }
рдкреЗрдЬ рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рдЪрд╛рд░ рдкреЗрдЬ рд╣реЛрддреЗ рд╣реИрдВ: рдкреЗрдЬ 1, рдкреЗрдЬ 2, рдкреЗрдЬ 3, рдкреЗрдЬ404ред рдкрд╣рд▓реЗ рджреЛ рдмрд╕ рдЗрд╕реА рдирд┐рдЬреА ViewModel рдХреА рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдЬреБрдбрд╝реЗ рдкрд╛рда рдмреНрд▓реЙрдХ рд╣реЛрддреЗ рд╣реИрдВред рдореИрдВ рддреАрд╕рд░реЗ рдПрдорд╡реАрд╡реАрдПрдо рд╕рдорд╕реНрдпрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрд╕рд░реЗ рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реВрдВ, рдЕрд░реНрдерд╛рддреН ListBox.SelectedItems рдХреЛ ViewModel рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХрд╛ рдХрд╛рд░реНрдпред рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рд╣реИ, рдЬреЛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рдпреЛрдЧреНрдп рд╣реИред рдордЬрд╝реЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕реНрдкреЙрдЗрд▓рд░ рдорд╛рд░реНрдХрдЕрдк рдХреЗ рдиреАрдЪреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдорд╛рд░реНрдХрдЕрдк рдкреЗрдЬ 3 <Page x:Class="Pages.Page3" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:tkx="http://schemas.xceed.com/wpf/xaml/toolkit" mc:Ignorable="d" d:DesignHeight="400" d:DesignWidth="400"> <Grid> <tkx:ChildWindow WindowState="Open" Caption="My Dialog" IsModal="True" WindowStartupLocation="Center"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition /> </Grid.RowDefinitions> <TextBlock Text="{Binding Page3Text, FallbackValue='No Data'}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="24" FontWeight="Bold"/> <StackPanel Grid.Row="1"> <TextBlock Text="Category:" Margin="5"/> <ComboBox Text="Select..." Margin="5"> <ComboBoxItem Content="Category 1"/> <ComboBoxItem Content="Category 2"/> <ComboBoxItem Content="Category 3"/> </ComboBox> <TextBlock Text="Items:" Margin="5 10 5 5"/> <ListBox Margin="5" SelectionMode="Multiple"> <ListBoxItem Content="Item 1"/> <ListBoxItem Content="Item 2"/> <ListBoxItem Content="Item 3"/> <ListBoxItem Content="Item 4"/> <ListBoxItem Content="Item 5"/> <ListBoxItem Content="Item 6"/> <ListBoxItem Content="Item 7"/> <ListBoxItem Content="Item 8"/> </ListBox> </StackPanel> </Grid> </tkx:ChildWindow> </Grid> </Page>
рдЗрд╕ рдкреГрд╖реНрда рдкрд░ рдореИрдВрдиреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╢реНрд░реЗрдгреА рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЗ рдЪрдпрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рд╕рдВрд╡рд╛рдж рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЗ рдХрд░реАрдм рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдКрдкрд░ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рд╕рдВрд╡рд╛рдж рдХрд╛ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдзреНрдпрд╛рди рджреЗрдВ, рдЯреЗрдХреНрд╕реНрдЯ рдмреНрд▓реЙрдХ рдбрд╛рдпрд▓реЙрдЧ рдмреЙрдХреНрд╕ рдореЗрдВ рдЭреВрда рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЯреНрд░рд┐рдХ рдХреЗ рд╕реАрдзреЗ рдкреЗрдЬ рдХреЗ DataContext рд╕реЗ рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ WPF рдЯреВрд▓рдХрд┐рдЯ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реЗ рдЪрд╛рдЗрд▓реНрдбрд╡рд┐рдВрдбреЛ рдХреА рдпреЛрдЧреНрдпрддрд╛ рд╣реИред рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ XAML рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рдВрд╢рдЬ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, DataContext рдЪрд╛рдЗрд▓реНрдбрд╡рд┐рдВрдбреЛ рдореЗрдВ рдЧреНрд░рд┐рдб рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕реЗ рдбрд╛рд▓рд╛ рд╣реИред
рд╕реВрдЪреА рдмреЙрдХреНрд╕ рдореЗрдВ рдХрдИ рдЪрдпрди рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВред ViewModel рдХреА рд╕реВрдЪреА рдореЗрдВ рдЪрдпрдирд┐рдд рд╕реВрдЪреАрдмреЙрдХреНрд╕ рддрддреНрд╡реЛрдВ рдкрд░ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕реАрдзреЗ рдмрд╛рдЗрдВрдбрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрдкрддреНрддрд┐ ListBox.SelectedItems рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк ListBox рдХреЛ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ DependencyProperty рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдорд╡реАрд╡реАрдПрдо рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рдЬреЛ рдореИрдВ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред
IoC (рдкреНрд░рдмрдВрдзрди рдХрд╛ рдЙрд▓рдЯрд╛)
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рд╡реЙрд▓реНрдпреВрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдбрд╝рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдЖрд╡рд╢реНрдпрдХ рдЬреНрдЮрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рд╣реИрдмрд░ рдХреЗ рд▓реЗрдЦреЛрдВ рд╕реЗ ред рдЖрдк рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрд╕рд╛рдзрди рднреА рдЧреВрдЧрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, "рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рд╡реНрдпреБрддреНрдХреНрд░рдо" рдПрдХ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд╕реЗ рджреВрд╕рд░реА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рд╕реАрдзреЗ рд▓рд┐рдВрдХ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд╡рд┐рд╢реЗрд╖ "
рдХрдВрдЯреЗрдирд░реЛрдВ " рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧ рдФрд░ рдХреМрди рд╕реЗ рдЕрд╕реЗрдВрдмрд▓рд┐рдпреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдЕрдиреБрднрд╛рдЧ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ IoC рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИред рд╕рдЪ рдХрд╣реВрдВ рддреЛ рд╡рд╣ рдЙрджреНрджреЗрд╢реНрдп рдирд╣реАрдВ рдерд╛ред рдмреЗрд╢рдХ, рдореИрдВрдиреЗ рдХреЛрдб рдореЗрдВ IoC рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдХреЛрдб рдХреЛ рдХрдо рдЬреБрдбрд╝рд╛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред
рдиреАрдЪреЗ рдХрдВрдЯреЗрдирд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред
namespace ViewModels.Interfaces { public interface IViewModelsResolver { INotifyPropertyChanged GetViewModelInstance(string alias); } } namespace Navigator.Navigation.Interfaces { public interface IPageResolver { Page GetPageInstance(string alias); } }
рдпреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреГрд╖реНрда рдХрдВрдЯреЗрдирд░реЛрдВ рдФрд░ рд╡реНрдпреВрдореЙрдбрд▓реНрд╕ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВред рдлрд┐рд▓рд╣рд╛рд▓, рдореИрдВрдиреЗ рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдП рд╣реИрдВ рдЬрд┐рдирдХрд╛
рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЛ
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХрднреА рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред
рдкрд░реАрдХреНрд╖рдг рдХрдВрдЯреЗрдирд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди namespace Navigator.Navigation { public class PagesResolver : IPageResolver { private readonly Dictionary<string, Func<Page>> _pagesResolvers = new Dictionary<string, Func<Page>>(); public PagesResolver() { _pagesResolvers.Add(Navigation.Page1Alias, () => new Page1()); _pagesResolvers.Add(Navigation.Page2Alias, () => new Page2()); _pagesResolvers.Add(Navigation.Page3Alias, () => new Page3()); _pagesResolvers.Add(Navigation.NotFoundPageAlias, () => new Page404()); } public Page GetPageInstance(string alias) { if (_pagesResolvers.ContainsKey(alias)) { return _pagesResolvers[alias](); } return _pagesResolvers[Navigation.NotFoundPageAlias](); } } } namespace ViewModels { public class ViewModelsResolver : IViewModelsResolver { private readonly Dictionary<string, Func<INotifyPropertyChanged>> _vmResolvers = new Dictionary<string, Func<INotifyPropertyChanged>>(); public ViewModelsResolver() { _vmResolvers.Add(MainViewModel.Page1ViewModelAlias, () => new Page1ViewModel()); _vmResolvers.Add(MainViewModel.Page2ViewModelAlias, () => new Page2ViewModel()); _vmResolvers.Add(MainViewModel.Page3ViewModelAlias, () => new Page3ViewModel()); _vmResolvers.Add(MainViewModel.NotFoundPageViewModelAlias, () => new Page404ViewModel()); } public INotifyPropertyChanged GetViewModelInstance(string alias) { if (_vmResolvers.ContainsKey(alias)) { return _vmResolvers[alias](); } return _vmResolvers[MainViewModel.NotFoundPageViewModelAlias](); } } }
рдпреЗ рд╕рд┐рд░реНрдл рдХрдВрдЯреЗрдирд░ рдХреА "рдЧреБрдбрд╝рд┐рдпрд╛" рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХреБрдЫ рдХреЗ рд╕рд╛рде рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдПрдХрддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗред рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ
IUnityContainer рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рдмреЛрдЭ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рдореЗрд░реЗ рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдзрд╛рд░рдгрд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдпреВрдирд┐рдЯреА рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рдЕрдиреНрдп IoC рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЧреЗ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВрд╣реИрдмреНрд░рд╣рд╛рдм рдкрд░ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВрд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ MVVM рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВрд╣рдмрд░рд╛рдмреНрд░ рдкрд░ рдПрдорд╡реАрд╡реАрдПрдо рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ