рдЖрд╡реЗрджрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ!
WPF рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдореЗрдВ рд╕реЗ рдХрдИ рдиреЗ рд╢рд╛рдпрдж рд╣рдЬрд╛рд░реЛрдВ рдмрд╛рд░ рд╡реНрдпреВ рд╡реНрдпреВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рд╣реИ:
{ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЖрдЗрдЯрдо }
рдпрджрд┐ рдЖрдЗрдЯрдо рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдЖрдЗрдЯрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдереНрд░реЗрдб рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ "рдореГрдд" рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд┐рд▓рддрд╛ рд╣реИред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрдЧрд╛ред рдФрд░ рдЕрдЧрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдордп рд╡рд┐рдВрдбреЛрдЬ рд╡рд┐рдВрдбреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рд╕реАрдорд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдЗрд╕ рд╡рд┐рдВрдбреЛ рдХреЛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдЧрд╛: рдЕрдВрддрд┐рдо рд╕рдлрд▓ рд╡рд┐рдВрдбреЛ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреА рдЫрд╡рд┐ рдкрд░ рдПрдХ рд╕рдлреЗрдж рдореБрдЦреМрдЯрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рд░реНрдХрд░ (рдЬрд╡рд╛рдм рдирд╣реАрдВ) ( (рдХреЛрдИ рдЬрд╡рд╛рдм рдирд╣реАрдВ)) рд░реВрд╕реА рд╕реНрдерд╛рдиреАрдпрдХрд░рдг ):
рд╣рд╛рдБ, рдЖрдкрдиреЗ рд╕реНрд╡рдпрдВ рднреА рд╢рд╛рдпрдж рдПрдХ рд╣реА рдЪрд┐рддреНрд░ рдХреЛ рдХрдИ рдмрд╛рд░ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдЬрдм рдХреБрдЫ рдЕрдиреБрдкреНрд░рдпреЛрдЧ "рд╕реНрд╡рдпрдВ рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ" рдПрдХ рд╡рд┐рдлрд▓рддрд╛ рдпрд╛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдкред рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рддрдирд╛ рдкрд░реЗрд╢рд╛рди рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢
рд╕рдорд╛рдзрд╛рди # 1: рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ ObjectDataProvider
рд╕рдорд╛рдзрд╛рди рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рдЖрджрд░реНрд╢ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рдореМрдЬреВрджрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ ObjectDataProvider рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЪрд░рдг # 1: рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдереИрддрд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ
рдПрдХ рдкреНрд░рджрд╛рддрд╛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рд╣реИ:
// Emulates a long items getting process using some delay of getting of each item <br/>
public static class AsyncDataProvider<br/>
{ <br/>
private const int _DefaultDelayTime = 300 ; <br/>
<br/>
public static ReadOnlyCollection < string > GetItems ( ) <br/>
{ <br/>
return GetItems ( _DefaultDelayTime ) ; <br/>
} <br/>
<br/>
public static ReadOnlyCollection < string > GetItems ( int delayTime ) <br/>
{ <br/>
List < string > items = new List < string > ( ) ; <br/>
foreach ( string item in Enum . GetNames ( typeof ( AttributeTargets ) ) . OrderBy ( item => item. ToLower ( ) ) ) <br/>
{ <br/>
items. Add ( item ) ; <br/>
// Syntetic delay to emulate a long items getting process <br/>
Thread. Sleep ( delayTime ) ; <br/>
} <br/>
<br/>
return items. AsReadOnly ( ) ; <br/>
} <br/>
}
рдЪрд░рдг # 2: XAML рдореЗрдВ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ
<Window.Resources > <br/>
<ObjectDataProvider x:Key = "AsyncDataSource" <br/>
IsAsynchronous = "True" <br/>
ObjectType = "Providers:AsyncDataProvider" <br/>
MethodName = "GetItems" /> <br/>
<Converters:NullToBooleanConverter x:Key = "NullToBooleanConverter" /> <br/>
</Window.Resources >
NullToBooleanConverter рдХрдирд╡рд░реНрдЯрд░ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд╕реНрддреБ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдирд╛рдо рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ( рдЗрд╕рдХрд╛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╖рдп рд╕реЗ рдЬреБрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ )ред рд╕рднреА рдЬрд╛рджреВ рдЗрд╕ ObjectDataProvider рдХреЗ IsAsynchronous = "True" рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ - рдпрджрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ "рдЯреНрд░реВ" рдкрд░ рд╕реЗрдЯ рд╣реИ , рддреЛ WPF рдХреЛрд░ рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рд╕реНрдкреИрдЪрд░ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдмрдВрдзрди рдХреЛ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдереНрд░реЗрдб рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдереНрд░реЗрдб рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд┐рдП рдмрд┐рдирд╛ред
рдЪрд░рдг # 3: рдХреЛрдб рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
<ListBox x:Name = "ItemsListBox" <br/>
ItemsSource = "{Binding Source={StaticResource AsyncDataSource}, IsAsync=True}" > <br/>
<ListBox.Style > <br/>
<Style TargetType = "{x:Type ListBox}" > <br/>
<Style.Triggers > <br/>
<Trigger Property = "ItemsSource" Value = "{x:Null}" > <br/>
<Setter Property = "Template" Value = "{StaticResource WaitControlTemplate}" /> <br/>
</Trigger > <br/>
</Style.Triggers > <br/>
</Style > <br/>
</ListBox.Style > <br/>
</ListBox >
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ - рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░рд┐рдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ - рдпрджрд┐ рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреБрдЫ рд▓рдВрдмреЗ рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╣ рд╕реЛрдЪреЗрдВрдЧреЗ рдХрд┐ рдЖрд╡реЗрджрди рдмрд╕ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реВрдЪреА рдкрд░ рдХреЛрдИ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрдЧреА ( рдпрджрд┐ рдЙрдирдХреЗ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХ )ред
рдЪрд░рдг # 4: рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛
<Button Grid.Column = "1" <br/>
Content = "Edit" <br/>
Width = "70" <br/>
IsEnabled = "{Binding SelectedItem, ElementName=ItemsListBox, Converter={StaticResource NullToBooleanConverter}}" <br/>
Click = "EditButton_Click" /> <br/>
рдЪрд░рдг # 5: рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ
рд╣рдорд╛рд░реЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЗ рдмрд╛рдж рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИ:
рдФрд░ рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдмрдЯрди рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрдирд╡рд░реНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрдпрдирд┐рдд рддрддреНрд╡ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдпрджрд┐ рдЪрдпрдирд┐рдд рдЖрдЗрдЯрдо ItemListBox рдХреА рдореБрдЦреНрдп рд╕реВрдЪреА рдореЗрдВ рдирд╣реАрдВ рд╣реИ , рддреЛ рдмрдЯрди рдЕрдиреБрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рддрд╛ AsyncDataSource рджреНрд╡рд╛рд░рд╛ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╕реВрдЪреА рднрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдХрд┐рд╕реА рддрддреНрд╡ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдХреНрд▓реЛрдЬрд╝ рдмрдЯрди рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рднреА рдЖрдкрдХреЛ рдЗрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣рдорд╛рд░реЗ рдЕрдиреБрд░реЛрдз рдФрд░ рдкрд╛рд╕ рдХрд╛ рд╕рд╣реА рдЙрддреНрддрд░ рджреЗрдЧрд╛, рдЬреЛ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЗ рд╕рдордХрд╛рд▓рд┐рдХ рд╣реЛрдиреЗ рдкрд░ рдирд╣реАрдВ рд╣реБрдЖ рд╣реЛрдЧрд╛ред
рд╕рдорд╛рдзрд╛рди # 2 рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдмрдВрдзрди
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рджреВрд╕рд░рд╛ рд╕рдорд╛рдзрд╛рди MV-VM (рдореЙрдбрд▓-рд╡реНрдпреВ-рд╡реНрдпреВрдореЙрдбрд▓) рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╢рд╛рдпрдж WPF рдФрд░ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдореЙрдбреНрдпреВрд▓рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдкреИрдЯрд░реНрди рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЗрд╕ рдкреИрдЯрд░реНрди рдХреА рдЪрд░реНрдЪрд╛ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИ - рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ ( рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реИрдВ, рддреЛ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ )ред
рдЪрд░рдг # 1:
рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдВрдбреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╢реНрдп рдореЙрдбрд▓ рдмрдирд╛рдПрдВ:
public class MainViewModel<br/>
{ <br/>
private ICommand _commandClose ; <br/>
<br/>
private ICommand _commandEdit ; <br/>
<br/>
private ReadOnlyCollection < string > _items ; <br/>
<br/>
public ReadOnlyCollection < string > Items<br/>
{ <br/>
get<br/>
{ <br/>
if ( _items == null ) <br/>
{ <br/>
_items = AsyncDataProvider. GetItems ( ) ; <br/>
} <br/>
<br/>
return _items ; <br/>
} <br/>
} <br/>
<br/>
public ICommand CommandClose<br/>
{ <br/>
get<br/>
{ <br/>
if ( _commandClose == null ) <br/>
{ <br/>
_commandClose = new RelayCommand ( p => OnClose ( ) ) ; <br/>
} <br/>
<br/>
return _commandClose ; <br/>
} <br/>
} <br/>
<br/>
public ICommand CommandEdit<br/>
{ <br/>
get<br/>
{ <br/>
if ( _commandEdit == null ) <br/>
{ <br/>
_commandEdit = new RelayCommand ( p => OnEdit ( p ) , p => CanEdit ) ; <br/>
} <br/>
<br/>
return _commandEdit ; <br/>
} <br/>
} <br/>
<br/>
public string SelectedItem<br/>
{ <br/>
get ; <br/>
set ; <br/>
} <br/>
<br/>
private void OnClose ( ) <br/>
{ <br/>
App. Current . Shutdown ( ) ; <br/>
} <br/>
<br/>
private void OnEdit ( object parameter ) <br/>
{ <br/>
MessageBox. Show ( String . Format ( "Edtiting item: {0}" , <br/>
parameter != null ? parameter. ToString ( ) : "Not selected" ) ) ; <br/>
} <br/>
<br/>
private bool CanEdit<br/>
{ <br/>
get<br/>
{ <br/>
return SelectedItem != null ; <br/>
} <br/>
} <br/>
}
рдЪрд░рдг # 2: рдореБрдЦреНрдп рд░реВрдк рд╕реЗ XAML рдХреЛрдб рдореЗрдВ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдШреЛрд╖рдгрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ
<ListBox x:Name = "ItemsListBox" <br/>
Grid.Row = "0" <br/>
ItemsSource = "{Binding Items, IsAsync=True}" <br/>
SelectedItem = "{Binding SelectedItem}" > <br/>
<ListBox.Style > <br/>
<Style TargetType = "{x:Type ListBox}" > <br/>
<Style.Triggers > <br/>
<Trigger Property = "ItemsSource" Value = "{x:Null}" > <br/>
<Setter Property = "Template" Value = "{StaticResource WaitControlTemplate}" /> <br/>
</Trigger > <br/>
</Style.Triggers > <br/>
</Style > <br/>
</ListBox.Style > <br/>
</ListBox >
рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ: "{рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЖрдЗрдЯрдо, рдЗрд╕реНрд╕реБрд╕рд┐рдВрдХреНрд╕ = 1" ред ObjectDataProvider рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдореЗрдВ , WPF рдХреЛрд░ рдПрдХ рдЕрд▓рдЧ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреГрд╖реНрдарднреВрдорд┐ рдбрд┐рд╕реНрдкреИрдЪрд░ рдмрдирд╛рдПрдЧрд╛ред
рдЕрд▓рдЧ-рдЕрд▓рдЧ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рд╣рдореЗрдВ рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рджреГрд╢реНрдп рдХреЗ XAML рдХреЛрдб рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХреЛ рдХреЛрдбрд┐рдВрдЧ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рджреГрд╢реНрдп рдореЙрдбрд▓ рдХреЛрдб рдореЗрдВ, MainViewModel.CanEdit рд╕рдВрдкрддреНрддрд┐, рдЬреЛ MainViewModel.CommandEdit рдХрдорд╛рдВрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдкреНрд░рдкрддреНрд░ рдкрд░ рд╕рдВрдкрд╛рджрди рдмрдЯрди рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЖрдк рд▓рд┐рдВрдХ рдЕрдиреБрднрд╛рдЧ рдХреЛ рджреЗрдЦрдХрд░ рдХрдорд╛рдВрдб рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ - рдХрдорд╛рдВрдбрдореИрди рдХреНрд▓рд╛рд╕ рд╕рдм рдХреБрдЫ рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦреЗрдЧрд╛ред рд╣рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рд╡рд╣ ICommand рдЕрдиреБрдмрдВрдз рдХрд╛ рд╕рд╣реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬреЛ RelayCommand рд╡рд░реНрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рдЖрдк рд╕рдВрд▓рдЧреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред
рдШрд░ рдХрд╛ рдкрд╛рда
рд╡рд╕реАрдпрдд рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ - рдореИрдВрдиреЗ рдЪреЗрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреВрдЫреЗрдВ рдирд╣реАрдВ :) рдЖрдк рд╕рднреА рдирд┐рдпрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрдг-рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рд╡рд╛рдЯреНрд╕рдПрдк рдХрдВрдЯреНрд░реЛрд▓ рдХреЛ рд╕реАрдорд╛ рдмреЙрд░реНрдбрд░ рд╡рд░реНрдЧ рдпрд╛ рдЗрд╕рдХреЗ рдкреВрд░реНрд╡рдЬ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реЗ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдмрджрд▓рдХрд░ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрддреНрд╡ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рддрд░реНрдХ рд╕рд░рд▓ рд╣реЛрдЧрд╛:
- рдПрдХ рддрддреНрд╡ рдХреЗ рдЕрдВрджрд░, рдЖрдк рдХреЗрд╡рд▓ ItemControl рдпрд╛ рдЗрд╕рдХреЗ рдХрд┐рд╕реА рд╡рдВрд╢рдЬ ( ListBox, ListView, TreeView рдЖрджрд┐ ) рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рд╕рдмрд╕реЗ рдХрдареЛрд░ рд╕реНрддрд░ рдкрд░ рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдпрджрд┐ рд╕рд╛рдордЧреНрд░реА рд╕рдВрдкрддреНрддрд┐ рдПрдХ ItemControl рдирд╣реАрдВ рд╣реИ
- рдЬрдм рдХрдиреНрдЯреИрдВрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдмрджрд▓реА рдЬрд╛рддреА рд╣реИ, рддреЛ рдХрдВрдЯреЗрдВрдЯ, рдХрдВрдЯреЗрдВрдЯ рдХреЛ рдХрдВрдЯреНрд░реЙрд▓ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдЗрдЯрдореНрд╕ рд╕реЛрд░реНрд╕ рд╕реЛрд░реНрд╕ рдХреА рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╡реИрд▓реНрдпреВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ
- рдпрджрд┐ рдкрд┐рдЫрд▓рд╛ рдЪрд░рдг рд╕рдлрд▓ рдерд╛ - рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдореЛрдб рдореЗрдВ рдбрд╛рд▓реЗрдВ
- рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рджреГрд╢реНрдп рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░реЙрдХреНрд╕реА рдкреИрдЯрд░реНрди рдХреЗ рддрд░реНрдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЬрдмрдХрд┐ рдирд┐рдпрдВрддреНрд░рдг рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИ, рдирд┐рдпрдВрддреНрд░рдг рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА (рдПрдХ рдХрддрд╛рдИ рд▓реЛрдбрд┐рдВрдЧ рд╕рдВрдХреЗрддрдХ рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрдЫ рд░рд╣рд╛ рдПрдХ рд╢рд┐рд▓рд╛рд▓реЗрдЦ) рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд╛рдордЧреНрд░реА рд╕рдВрдкрддреНрддрд┐ рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИред
рд╕рд╛рд░рд╛рдВрд╢
рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдореБрдЦреНрдп рдЧреНрд░рд╛рд╣рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИрдВред рдФрд░ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд╕рдордп-рд╕рдордп рдкрд░ рдЦреБрдж рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ, рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЪрдХреНрд░ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ) рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реИ рдФрд░ рд╡рд╣ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ) рдХреНрдпрд╛ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред
рд╕реНрд░реЛрдд рдХреЛрдб
AsyncBinding.zip
рд╕рдВрджрд░реНрдн
рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдореЙрдбрд▓ рдореЙрдбрд▓-рд╡реНрдпреВ-рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде WPF рдЕрдиреБрдкреНрд░рдпреЛрдЧ
рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдо рдЕрд╡рд▓реЛрдХрди
рд╡рд┐рдВрдбреЛрдЬ рдкреНрд░рд╕реНрддреБрддрд┐ рдлрд╛рдЙрдВрдбреЗрд╢рди рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ WPF
рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЫрд╡рд┐ рдХрд╛ рдореВрд▓ рдпрд╣рд╛рдВ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред