рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░рдирд╛

рдЫрд╡рд┐

рдЖрд╡реЗрджрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ!



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 рд╡рд░реНрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рдЖрдк рд╕рдВрд▓рдЧреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред



рдШрд░ рдХрд╛ рдкрд╛рда



рд╡рд╕реАрдпрдд рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ - рдореИрдВрдиреЗ рдЪреЗрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреВрдЫреЗрдВ рдирд╣реАрдВ :) рдЖрдк рд╕рднреА рдирд┐рдпрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрдг-рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рд╡рд╛рдЯреНрд╕рдПрдк рдХрдВрдЯреНрд░реЛрд▓ рдХреЛ рд╕реАрдорд╛ рдмреЙрд░реНрдбрд░ рд╡рд░реНрдЧ рдпрд╛ рдЗрд╕рдХреЗ рдкреВрд░реНрд╡рдЬ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕реЗ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдмрджрд▓рдХрд░ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрддреНрд╡ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рддрд░реНрдХ рд╕рд░рд▓ рд╣реЛрдЧрд╛:





рд╕рд╛рд░рд╛рдВрд╢



рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдореБрдЦреНрдп рдЧреНрд░рд╛рд╣рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИрдВред рдФрд░ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд╕рдордп-рд╕рдордп рдкрд░ рдЦреБрдж рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ, рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЪрдХреНрд░ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ) рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реИ рдФрд░ рд╡рд╣ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ) рдХреНрдпрд╛ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред



рд╕реНрд░реЛрдд рдХреЛрдб



AsyncBinding.zip



рд╕рдВрджрд░реНрдн



рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдореЙрдбрд▓ рдореЙрдбрд▓-рд╡реНрдпреВ-рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде WPF рдЕрдиреБрдкреНрд░рдпреЛрдЧ

рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдо рдЕрд╡рд▓реЛрдХрди

рд╡рд┐рдВрдбреЛрдЬ рдкреНрд░рд╕реНрддреБрддрд┐ рдлрд╛рдЙрдВрдбреЗрд╢рди рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ WPF

рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЫрд╡рд┐ рдХрд╛ рдореВрд▓ рдпрд╣рд╛рдВ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



All Articles