рдПрдХ рдкрд░реАрдХреНрд╖рдг рдореИрджрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рдПрдХреНрд╕рдЯреЗрдВрд╕реАрдмрд┐рд▓рд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ (MEF)

рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢реНрди


рдкреНрд░рд╢реНрди 1: MEF рдФрд░ INotifyPropertyChanged: рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдирд┐рд░реНрдпрд╛рдд рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ рдХреИрд╕реЗ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВ?

рдкреНрд░рд╢реНрди 2: MEF рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдпрд╛рдд рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдПрдХ рд╕рдВрдЧреНрд░рд╣ (ImportMany) рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЕрдзрд┐рд╕реВрдЪрдирд╛ред

рдкреНрд░рд╢реНрди 3: MEF рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдВрдЧ рдкрд░ XAP рдлрд╛рдЗрд▓реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред

рдкреНрд░рд╢реНрди 4: рдПрдорд╡реАрд╡реАрдПрдо рдкреИрдЯрд░реНрди рдореЗрдВ рдПрдХ рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛред



рд╕рдорд╕реНрдпрд╛ рдХрдерди (рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ)


рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рдирдВрдмрд░ 1 : рдореИрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ (рд╢реЗрд▓) рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рдЪрд░рдг рдкрд░ MEF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рдЦреЛрдЬрдиреЗ" рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдорд╛рдВрдЧ рдкрд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ "рд▓реЛрдб" рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдбрд╛рдЙрдирд▓реЛрдб" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ)ред



рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рд╕рдВрдЦреНрдпрд╛ 2 : рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЬрдм рдПрдХ рд╕рдВрдкрд╛рджрдХ рдХреА рдЦрд┐рдбрд╝рдХреА рдореЗрдВ рдореЗрд░реА рд╡рд╕реНрддреБ рдХрд╛ рд╕рдВрдкрд╛рджрди рд╢реБрд░реВ рд╣реЛ, рддреЛ рдмрджрд▓рд╛рд╡ рддреБрд░рдВрдд рджреВрд╕рд░реА рд╡рд┐рдВрдбреЛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдП рдЧрдПред



рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рд╕рдВрдЦреНрдпрд╛ 3 : рдореИрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЕрдкрдиреА рдЗрдХрд╛рдИ (рдореЗрд░реЗ MyObject) рдХреЗ рд╕рдВрдкрд╛рджрдХ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЪрд▓реЛ рдЙрдирдореЗрдВ рд╕реЗ рджреЛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╕рдВрдкрд╛рджрдХ рдЖрд╡реЗрджрди рдХреЗ рдореБрдЦреНрдп рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рддреБрд░рдВрдд рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛, рдФрд░ рджреВрд╕рд░рд╛ рдЗрд╕реЗ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рдЕрд▓рдЧ рдПрдХреНрд╕рдПрдкреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рд╣рдиреЗ рджреЗрдВ рдФрд░ рдХреЗрд╡рд▓ рддрднреА рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ рдЬрдм рдЗрд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдорд╛рдВрдЧ рдкрд░ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рд╡рд┐рджреЗрд╢ рдореЗрдВ рдУрдирдбреЗрдореИрдВрдб рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ) )ред



рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рд╕рдВрдЦреНрдпрд╛ 4 : рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрдкрд╛рджрдХ рдПрдХ рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЦреЛрд▓реЗрдВред



рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдЕрд╕реЗрдВрдмрд▓реА


рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ, рдореИрдВ рдЕрдкрдиреА рдЦреБрдж рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рдХреНрд▓рд╛рд╕ рдЕрд╕реЗрдВрдмрд▓реА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ Calabonga.Silverlight.Framework.dll рд╣реИ, рдЬрд┐рд╕рдиреЗ рд╕рдВрдпреЛрдЧрд╡рд╢, рдЗрд╕рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ 1.0.5 рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрджрд▓реА рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдПрдХ рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ (рдореЛрдбрд▓рдбрд╛рдпрд▓реЙрдЧ) рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдЬреЛрдбрд╝рддрд╛ рд╣реИред (рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣реИред) рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореЙрдбрд▓ рд╡рд┐рдВрдбреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ MVVM рдкреИрдЯрд░реНрди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рджреГрд╢реНрдп рд╡рд░реНрдЧ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред



рджреВрд╕рд░реА рдЕрд╕реЗрдВрдмрд▓реА, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдХреЗ рд╕рд╛рде рд▓рдЧрд╛рддрд╛рд░ рдмрд╛рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдерд╛, рдХреЛ XapService рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред рдпрд╣ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд▓реЗрдЦрди рд╕реЗрд╡рд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдЕрд╕реЗрдВрдмрд▓реА рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣реИ рдЬрд┐рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬреЛ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред



"рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ" рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╕рдорд╛рдзрд╛рди рдПрдХ рд╕рдорд╛рдзрд╛рди (рд╕рдорд╛рдзрд╛рди) рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдпрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВред рдЗрд╕ рдмрд╛рд░ рдПрдХ рд╕рдорд╛рдзрд╛рди рдореЗрдВ 6 рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд▓рдЧреАрдВред (SLN):



рдЫрд╡рд┐



рдЕрдВрдЬреАрд░ред 1. "рдирд┐рд░реНрдгрдп рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдЬреЛ рдЗрд╕рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ"



рдореЗрдлреЗрд╕реНрдЯ рд╕рдмрд╕реЗ рдореБрдЦреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ рдореЙрдбреНрдпреВрд▓ (рд╢реЗрд▓) рдХреЗ рд▓рд┐рдП рд╢реЗрд▓ рд╣реИред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИ (рдЗрд╕реЗ "рд╕реНрдЯрд╛рдлрд┐рдВрдЧ" рдХрд╣рддреЗ рд╣реИрдВ), рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рдирдВрдмрд░ 1 рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рд╕рдВрдкрд╛рджрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ (рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рдирдВрдмрд░ 3 рджреЗрдЦреЗрдВ)ред рдпрд╣ рд╕реНрдерд╛рдиреАрдп рдореЙрдбреНрдпреВрд▓ рд╡рд┐рдВрдбреЛ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:



рдЫрд╡рд┐



рдЕрдВрдЬреАрд░ред 2. "рдЖрдВрддрд░рд┐рдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рджреГрд╢реНрдп"



MefTest.Web рдПрдХ ASP.NET рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореЗрд░рд╛ рдкреНрд░рдпреЛрдЧ рд╣реЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ (рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛) рд╣реИред



FormView рдПрдХ рдмрд╛рд╣рд░реА рдореЙрдбреНрдпреВрд▓ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рд▓реЗрдЦрд╛рдВрдХрди") рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВред рдпрд╣ рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рдирдВрдмрд░ 1 рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред



рдЫрд╡рд┐



рдЕрдВрдЬреАрд░ред 3. "рдмрд╛рд╣рд░реА рдореЙрдбреНрдпреВрд▓ рдХрд╛ рджреГрд╢реНрдп"



рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯрд▓рд╛рдЗрдВрд╕ - рдЕрдиреБрдмрдВрдзреЛрдВ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рдЗрд╕ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рдирд╛рдорд┐рдд рдореЗрд░рд╛ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╡рд░реНрдЧ MyObject рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╕рднреА рдореЙрдбреНрдпреВрд▓ рдореЗрд░реА рдХрдХреНрд╖рд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЗрд╕ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



рдПрдбрд╡рд╛рдВрд╕реНрдбрдбрд┐рдЯрд░ - рд╕рдВрдкрд╛рджрдХ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реЗ рдПрдХ, рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рдирдВрдмрд░ 3 рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред



рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ MyObject рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдЬреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫрд╛ рд╕реВрдЪреА 2 рдХреЗ рд▓рд┐рдП INotifyPropertyChanged рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреЛрдб рдореЗрдВ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

public class MyObject : INotifyPropertyChanged

{

private string cityType;

public string Name

{

get { return name; }

set

{

name = value;

OnPropertyChanged("Name");

}

}

private string name;

public string CityType

{

get { return cityType; }

set

{

cityType = value;

OnPropertyChanged("CityType");

}

}



#region INotifyPropertyChanged Implementation

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string propertyName)

{

if (PropertyChanged != null)

{

PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

}

}

#endregion

}









MainPage (рдореБрдЦреНрдп рд╢реЗрд▓) рдореЗрдВ, рд╣рдо IDeploymentCatalogService xap рдлрд╝рд╛рдЗрд▓ рд▓реЛрдбрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдорд╛рдВрдЧ рдкрд░ xap рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ:



public partial class MainPage : UserControl, IPartImportsSatisfiedNotification

{

[Import]

public IDeploymentCatalogService CatalogService { get; set; }



public MainPage()

{

InitializeComponent();

CompositionInitializer.SatisfyImports(this);

}



[ImportMany(typeof(UserControl), AllowRecomposition=true)]

public UserControl[] Views { get; set; }



public void OnImportsSatisfied()

{

LayoutRoot.Children.Clear();

foreach (UserControl item in Views)

{

LayoutRoot.Children.Add(item);

}

}

}








рдореЛрдбрд▓ рдбрд╛рдпрд▓реЙрдЧ рд╡рд┐рдВрдбреЛ (рдореЛрдбрд▓рдбрд╛рдпрд▓реЙрдЧ)


рд╕реНрдХреНрд░реАрди рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдкрд╛рджрдХреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрди рдореЙрдбреНрдпреВрд▓реЛрдВ рдХреЛ рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ (рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдпреВрдЖрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдордЬрдмреВрдд рдирд╣реАрдВ рд╣реВрдВ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИред рдореЛрдбрд▓ рд╕рдВрд╡рд╛рдж рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ "рдлреНрд░реЗрдо" рд╣реА рдореЛрдбрд▓ рд╣реИред рдЗрд╕ рдврд╛рдВрдЪреЗ рдХрд╛ рдЖрдВрддрд░рд┐рдХ рд╕рдВрджрд░реНрдн рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ "рд╕реНрдЯрд╛рдлрд┐рдВрдЧ" рдореЙрдбреНрдпреВрд▓ (рдлреЙрд░реНрдорд▓реЛрдХ рдореБрдЦреНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдЖрдВрддрд░рд┐рдХ рдореЙрдбреНрдпреВрд▓ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рд╢реЗрд▓ рдХрд╣рддреЗ рд╣реИрдВ) рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ "рдЕрдХрд╛рдЙрдВрдЯрд┐рдВрдЧ" рдореЙрдбреНрдпреВрд▓ (рдлреЙрд░реНрдо рд╡реНрдпреВ рджреЗрдЦреЗрдВ) рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдорд╡реАрд╡реАрдПрдо (рдореЙрдбрд▓ - рд╡реНрдпреВ - рд╡реНрдпреВрдореЙрдбрд▓) рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ) рдкреИрдЯрд░реНрдиред рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣реА рд╕рдм рдХреБрдЫ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ)ред



рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдХреЗ рддреМрд░-рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ "рд╡рд╛рдпрд░реНрдб" рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХреА рдЫрдбрд╝реЗрдВ рд╣реИрдВред (рдпрджрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдореИрдВ рдмрд╛рдж рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдореЛрдбрд▓рдбрд┐рдпреЛрдЧ рдПрдХ рдЕрдиреНрдп рд▓реЗрдЦ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реЗрдЦ рд╕рдВрд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



FormExternalViewModel рдХреНрд▓рд╛рд╕ рдореЗрдВ рдореЛрдбрд▓рдбрд╛рдпрд▓реЙрдЧ рдкреНрд░реЙрдкрд░реНрдЯреА рд╣реИ, рдЬреЛ рд╡рд┐рдВрдбреЛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред



[Import]

public IModalDialog ModalDialog

{

get;

set;

}









рдкрд╣рд┐рдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдордЬрдмреВрдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЪрд╛рдЗрд▓реНрдбрд╡рд┐рдВрдбреЛ рдХрдВрдЯреНрд░реЛрд▓ (рдЗрд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрдбреЗрдб рдЪрд╛рдЗрд▓реНрдбрд╡рд┐рдВрдбреЛ рдХрд╣рдХрд░) рдХреЛ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд▓реЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдХреНрд╖рдорддрд╛рдПрдВ рджреАрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ IModalDialog рдЬрд╛рд░реА рдХрд░реЗрдВред



[Export(typeof(IModalDialog))]

public class ExtendedChildWindow : ChildWindow, IModalDialog

{

public void ShowDialog()

{

this.Width = 450;

this.Height = 300;

this.Show();

}

}








FormExternalViewModel рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рднреА рд╣реИ:



[ImportMany(AllowRecomposition = true)]

public IModalView[] Editors { get; set; }








IModalView рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рд┐рд░реНрдл рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдпрд╣реА рд╣реИ, рдХрд┐рд╕реА рднреА рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдг (рджреЗрдЦреЗрдВ рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рдмрдХрд╡рд╛рд╕) рдЬреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рдореЛрдбрд▓ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореЗрд░реЗ рдХрдИ, рдпрд╛ рджреЛ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╕рдВрдкрд╛рджрдХ рдФрд░ рдПрдХ рдмрд╛рд╣рд░реА рд╕рдВрдкрд╛рджрдХ рд╣реИрдВред рдЦреИрд░, рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореЛрдбрд▓ рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЗ рддрдерд╛рдХрдерд┐рдд "рдУрдкрдирд░" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:



[рдЖрдпрд╛рдд]

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ IModalDialogWorker ModalDialogWorker {рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ; рд╕реЗрдЯ; }



Calabonga.Silverlight.Framework.dll рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ FormExternalViewModel рд╡рд░реНрдЧ рдЖрдпрд╛рдд рдореЗрдВ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ OpenDialogCommand рдХрдорд╛рдВрдб рд╕реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореЛрдбрд▓ рд╕рдВрд╡рд╛рдж рдХреЗ "рд▓рд╛рдВрдЪрд░" рд╣реИ:



this.ModalDialogWorker.ShowDialog(this.ModalDialog, view, o, dialog =>

{

if (this.ModalDialog.DialogResult.HasValue &&

this.ModalDialog.DialogResult.Value)

{

}

});



"" ModalDialogWorker, Calabonga.Silverlight.Framework:



namespace Calabonga.Silverlight.Framework

{

[Export(typeof(IModalDialogWorker))]

public class ModalDialogWorker : IModalDialogWorker

{

public void ShowDialog(IModalDialog modalDialog, IModalView modalView, T dataContext, Action onClosed)

{

if (modalDialog == null)

throw new ArgumentNullException("modalDialog", " null");

if (modalView == null)

throw new ArgumentNullException("modalView", " null");



EventHandler onDialogClosedHandler = null;

EventHandler onViewClosedHandler = null;



if (onClosed != null)

{

onDialogClosedHandler = (s, a) =>

{

modalDialog.Closed -= onDialogClosedHandler;

onClosed(dataContext);

};



onViewClosedHandler = (s, a) =>

{

modalDialog.Closed -= onDialogClosedHandler;

modalView.Closed -= onViewClosedHandler;

modalDialog.DialogResult = a.DialogResult;

onClosed(dataContext);

};



modalDialog.Closed += onDialogClosedHandler;

modalView.Closed += onViewClosedHandler;

}



modalDialog.Content = modalView;

modalView.DataContext = dataContext;

modalDialog.ShowDialog();

}

}

}



, "" .



MEF

(shell) "" ( ), Managed Extensibility Framework (MEF). MEF , :



using System.ComponentModel.Composition;

using System.ComponentModel.Composition.Hosting;



, , . XAP-. , , (ExportAttribute), , FormExternal FormView:



[Export(typeof(UserControl))]

public partial class FormExternal : UserControl

{

public FormExternal()

{

InitializeComponent();

}

}








, , , , . (, , ...). () . View:



[ImportMany(typeof(UserControl), AllowRecomposition=true)]

public UserControl[] Views { get; set; }








:



AllowRecomposition=true







, MEF-. , . , . , , :



public MainPage()

{

InitializeComponent();

CompositionInitializer.SatisfyImports(this);

}








MEF- IPartImportsSatisfiedNotification, :



public void OnImportsSatisfied()

{

LayoutRoot.Children.Clear();

foreach (UserControl item in Views)

{

LayoutRoot.Children.Add(item);

}

}








. :



рдЫрд╡рд┐



, "", CheckBox . :



private IModalView[] editors;

[ImportMany(AllowRecomposition = true)]

public IModalView[] Editors

{

get

{ return editors; }

set

{

editors = value;

checkEditor.IsEnabled = (this.Editors != null) && (this.Editors.Count() > 1);

OnPropertyChanged("Editors");

}

}








Code-Bihind ViewModel (MVVM) ( ), . , "" ... !!!



рдЫрд╡рд┐



. , " " , , "" (. тДЦ3 AdvancedEditor).



private void Button_Click(object sender, RoutedEventArgs e)

{

CatalogService.AddXap("FormView.xap");

CatalogService.AddXap("AdvancedEditor.xap");

(sender as Button).IsEnabled = false;

}








, , ( ) , INotifyPropertyChanged.



: Memento .



, , CheckBox . , ( ) .



рдЫрд╡рд┐



- . ! ?! ! рдЫрд╡рд┐



Visual Studio 2010












this.ModalDialogWorker.ShowDialog(this.ModalDialog, view, o, dialog =>

{

if (this.ModalDialog.DialogResult.HasValue &&

this.ModalDialog.DialogResult.Value)

{

}

});



"" ModalDialogWorker, Calabonga.Silverlight.Framework:



namespace Calabonga.Silverlight.Framework

{

[Export(typeof(IModalDialogWorker))]

public class ModalDialogWorker : IModalDialogWorker

{

public void ShowDialog(IModalDialog modalDialog, IModalView modalView, T dataContext, Action onClosed)

{

if (modalDialog == null)

throw new ArgumentNullException("modalDialog", " null");

if (modalView == null)

throw new ArgumentNullException("modalView", " null");



EventHandler onDialogClosedHandler = null;

EventHandler onViewClosedHandler = null;



if (onClosed != null)

{

onDialogClosedHandler = (s, a) =>

{

modalDialog.Closed -= onDialogClosedHandler;

onClosed(dataContext);

};



onViewClosedHandler = (s, a) =>

{

modalDialog.Closed -= onDialogClosedHandler;

modalView.Closed -= onViewClosedHandler;

modalDialog.DialogResult = a.DialogResult;

onClosed(dataContext);

};



modalDialog.Closed += onDialogClosedHandler;

modalView.Closed += onViewClosedHandler;

}



modalDialog.Content = modalView;

modalView.DataContext = dataContext;

modalDialog.ShowDialog();

}

}

}



, "" .



MEF

(shell) "" ( ), Managed Extensibility Framework (MEF). MEF , :



using System.ComponentModel.Composition;

using System.ComponentModel.Composition.Hosting;



, , . XAP-. , , (ExportAttribute), , FormExternal FormView:



[Export(typeof(UserControl))]

public partial class FormExternal : UserControl

{

public FormExternal()

{

InitializeComponent();

}

}








, , , , . (, , ...). () . View:



[ImportMany(typeof(UserControl), AllowRecomposition=true)]

public UserControl[] Views { get; set; }








:



AllowRecomposition=true







, MEF-. , . , . , , :



public MainPage()

{

InitializeComponent();

CompositionInitializer.SatisfyImports(this);

}








MEF- IPartImportsSatisfiedNotification, :



public void OnImportsSatisfied()

{

LayoutRoot.Children.Clear();

foreach (UserControl item in Views)

{

LayoutRoot.Children.Add(item);

}

}








. :



рдЫрд╡рд┐



, "", CheckBox . :



private IModalView[] editors;

[ImportMany(AllowRecomposition = true)]

public IModalView[] Editors

{

get

{ return editors; }

set

{

editors = value;

checkEditor.IsEnabled = (this.Editors != null) && (this.Editors.Count() > 1);

OnPropertyChanged("Editors");

}

}








Code-Bihind ViewModel (MVVM) ( ), . , "" ... !!!



рдЫрд╡рд┐



. , " " , , "" (. тДЦ3 AdvancedEditor).



private void Button_Click(object sender, RoutedEventArgs e)

{

CatalogService.AddXap("FormView.xap");

CatalogService.AddXap("AdvancedEditor.xap");

(sender as Button).IsEnabled = false;

}








, , ( ) , INotifyPropertyChanged.



: Memento .



, , CheckBox . , ( ) .



рдЫрд╡рд┐



- . ! ?! ! рдЫрд╡рд┐



Visual Studio 2010












this.ModalDialogWorker.ShowDialog(this.ModalDialog, view, o, dialog =>

{

if (this.ModalDialog.DialogResult.HasValue &&

this.ModalDialog.DialogResult.Value)

{

}

});



"" ModalDialogWorker, Calabonga.Silverlight.Framework:



namespace Calabonga.Silverlight.Framework

{

[Export(typeof(IModalDialogWorker))]

public class ModalDialogWorker : IModalDialogWorker

{

public void ShowDialog(IModalDialog modalDialog, IModalView modalView, T dataContext, Action onClosed)

{

if (modalDialog == null)

throw new ArgumentNullException("modalDialog", " null");

if (modalView == null)

throw new ArgumentNullException("modalView", " null");



EventHandler onDialogClosedHandler = null;

EventHandler onViewClosedHandler = null;



if (onClosed != null)

{

onDialogClosedHandler = (s, a) =>

{

modalDialog.Closed -= onDialogClosedHandler;

onClosed(dataContext);

};



onViewClosedHandler = (s, a) =>

{

modalDialog.Closed -= onDialogClosedHandler;

modalView.Closed -= onViewClosedHandler;

modalDialog.DialogResult = a.DialogResult;

onClosed(dataContext);

};



modalDialog.Closed += onDialogClosedHandler;

modalView.Closed += onViewClosedHandler;

}



modalDialog.Content = modalView;

modalView.DataContext = dataContext;

modalDialog.ShowDialog();

}

}

}



, "" .



MEF

(shell) "" ( ), Managed Extensibility Framework (MEF). MEF , :



using System.ComponentModel.Composition;

using System.ComponentModel.Composition.Hosting;








, , . XAP-. , , (ExportAttribute), , FormExternal FormView:



[Export(typeof(UserControl))]

public partial class FormExternal : UserControl

{

public FormExternal()

{

InitializeComponent();

}

}








, , , , . (, , ...). () . View:



[ImportMany(typeof(UserControl), AllowRecomposition=true)]

public UserControl[] Views { get; set; }








:



AllowRecomposition=true







, MEF-. , . , . , , :



public MainPage()

{

InitializeComponent();

CompositionInitializer.SatisfyImports(this);

}








MEF- IPartImportsSatisfiedNotification, :



public void OnImportsSatisfied()

{

LayoutRoot.Children.Clear();

foreach (UserControl item in Views)

{

LayoutRoot.Children.Add(item);

}

}








. :



рдЫрд╡рд┐



, "", CheckBox . :



private IModalView[] editors;

[ImportMany(AllowRecomposition = true)]

public IModalView[] Editors

{

get

{ return editors; }

set

{

editors = value;

checkEditor.IsEnabled = (this.Editors != null) && (this.Editors.Count() > 1);

OnPropertyChanged("Editors");

}

}








Code-Bihind ViewModel (MVVM) ( ), . , "" ... !!!



рдЫрд╡рд┐



. , " " , , "" (. тДЦ3 AdvancedEditor).



private void Button_Click(object sender, RoutedEventArgs e)

{

CatalogService.AddXap("FormView.xap");

CatalogService.AddXap("AdvancedEditor.xap");

(sender as Button).IsEnabled = false;

}








, , ( ) , INotifyPropertyChanged.



: Memento .



, , CheckBox . , ( ) .



рдЫрд╡рд┐



- . ! ?! ! рдЫрд╡рд┐



Visual Studio 2010











All Articles