рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢реНрди
рдкреНрд░рд╢реНрди 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
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