рдЪрд░рдг-рджрд░-рдЪрд░рдг рдЯреНрд╡рд┐рдЯрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбрд▓-рд╡реНрдпреВ-рд╡реНрдпреВрдореЙрдбрд▓ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдХрд╛рд╕

рдкрд░рд┐рдЪрдп


рд▓реЗрдЦ MVVM рдФрд░ WPF рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИред рдпрд╣ рдЯреНрд╡рд┐рдЯрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЯреВрдЯ рдЧрдИ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдкрд╛рдардХ рдХреЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдЪрд░рдг рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдЬреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЙрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЧрдИ рдерд░реНрдбрдкрд╛рд░реНрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА TweetSharp ред рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рд▓рд┐рдВрдХ, рд╕рд╛рде рд╣реА рдореВрд▓ рд▓реЗрдЦ, рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рд▓реЗрдЦ WPF рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рдХреЛ WPF рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрдиреБрднрд╡ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рд╣реИред

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





рдЧреНрд░рд╛рд╣рдХ рдЯреНрд╡рд┐рдЯрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг



рдЕрдкрдиреЗ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдХреБрдЫ рдореМрдЬреВрджрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ GUI рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП:

рдЫрд╡рд┐

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

рдереЛрдбрд╝рд╛ рдФрд░ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ TabControl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред



рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ MVVM рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдБред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЛ рдПрдХ UserControl рд▓рд┐рдЦрдирд╛ рд╣реИ рдЬреЛ рдЯреНрд╡реАрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдЖрдк UserControl рдЬреЛрдбрд╝реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдЖрд╡рд╢реНрдпрдХ рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдХреЛ xaml рдореЗрдВ рдлреЗрдВрдХ рджреЗрдВред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдкреАрдЫреЗ рдХреЛрдб рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд╣рд╛рдВ рдЖрдк рдЯреНрд╡реАрдЯ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВрдЧреЗред рдлрд┐рд░ рдПрдХ рдШрдЯрдирд╛ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдкреАрдЫреЗ рдПрдХ рд╣реА рдХреЛрдб рдореЗрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЯреНрд╡реАрдЯ рдореЗрдВ UserPicture рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЖрдк рдкрд┐рдЫрд▓реА рдкреАрдврд╝реА рдХреА рддрдХрдиреАрдХреЛрдВ рдЬреИрд╕реЗ WinForms рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рдХрд░ рд░рд╣реЗ рдереЗред рдЖрдЗрдП рдЗрд╕ рдирд┐рдпрдВрддреНрд░рдг рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ - рдЗрд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рднрд╛рдЧ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИ - рдЙрди xamlред рдФрд░ рдкреАрдЫреЗ рдПрдХ рдХреЛрдб рднреА рд╣реИред

рдЕрдм рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЛ рдкрд╣рд▓рд╛ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдз рдорд┐рд▓рд╛ - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреНрдп рдЯреНрд╡реАрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЙрд╕реА рд╕рдЯреАрдХ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВред рдЖрдк рдпрд╛ рддреЛ рдкреАрдЫреЗ рдХреЛрдб рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рдзреНрд╡рдЬ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛, рдпрджрд┐ рдЖрдк рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рд╣реИрдВ, рддреЛ рдЖрдк GoF рдХреА рд░рдгрдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рджреВрд╕рд░рд╛ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдз рдЖрддрд╛ рд╣реИ - рдкреНрд░рддреНрдпреЗрдХ рдЯреНрд╡реАрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд░реВрдк рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рд╕рд╛рде рдкреБрд░рд╛рдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд░реЛрдХрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдкреБрд░рд╛рдиреЗ рд╡рд┐рддреНрддреАрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕реА рддрд░рд╣ - рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдирдИ рд╣реЛ рд░рд╣реА рд╣реИрдВ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕реЗ рд░реЛрдХреЛ! рдЖрдЗрдП рд╕рдордп рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ - рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдкрд░ рдЬрдм рдХреЗрд╡рд▓ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдерд╛ред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдХреЛрдб рдХреЛ рдкреАрдЫреЗ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рд╡рд░реНрдЧ рдХреЛ рд╕реНрд╡рдпрдВ рдлреИрд▓рд╛рдПрдВ? рд╡реЗ рд╕рд╛рд░ рдХреЛ рджреЛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЬрд┐рд╕реЗ рд╡реНрдпреВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреЗрдЦрддрд╛ рд╣реИ, рд╡реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдХреЛрдиреНрдЯреНрд░реЛрд▓ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╡рд░реНрдЧ рд╣реИрдВред рдФрд░ рджреВрд╕рд░рд╛ рдирд╛рдо ViewModel рд╣реИ - рдпреЗ рд╕реАрдзреЗ рдбреЗрдЯрд╛ рд╣реИ рдЬреЛ рджреГрд╢реНрдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди, рдЬреИрд╕реЗ рдЕрд╡рддрд╛рд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рддрдм рдкрд╣рд▓реА рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ - рдЖрдк рд╕рд┐рд░реНрдл рдПрдХ ViewModel рд▓рд┐рдЦреЗрдВ рдФрд░ рдкреБрд░рд╛рдиреЗ рджреГрд╢реНрдп рдХреЛ рдореИрдк рдХрд░реЗрдВред рдкрд╣рд▓рд╛ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдз рднреА рд╣рд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ - рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ View рдХреЛ рдПрдХ ViewModel рдореЗрдВ рдореИрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЖрдк рд╕реЛрдЪрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди View рдФрд░ ViewModel рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХреИрд╕реЗ рдмрдирд╛рдПрдВ? рдЗрд╕рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - WPF рдореЗрдВ рдПрдХ рдкреНрд░рдореБрдЦ рдЙрдкрдХрд░рдгред рдЖрдк рдПрдХ рддрд░рд╣ рд╕реЗ рджреЗрдЦреЗрдВ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ DataContext рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЙрдиреНрд╣реЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рдбреЗрдЯрд╛ рдХрд╣рд╛рдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЖрдк рдбреЗрдЯрд╛ рдХреЛ рд▓рдЧрднрдЧ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдмрд╛рдВрдзреЗрдВрдЧреЗ рдЬреИрд╕реЗ рдХрд┐ рдХреЛрдб рдХреЗ рд╕рд╛рде рдорд╛рдорд▓реЗ рдореЗрдВред рдореИрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдпрд╣рд╛рдВ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВ - рдЙрдиреНрд╣реЗрдВ рдЖрдЧреЗ рдмрддрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ MVVM рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд▓рд┐рдЦреЗ рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧ рдЖрд░реЗрдЦ рд╣реИ:

рдЫрд╡рд┐

рд╡реНрдпреВ рдХреНрд▓рд╛рд╕реЗрд╕ рд╣реИрдВ, рд╡реЗ ViewModel рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЙрдбрд▓ TweetSharp рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред ViewModel, рдмрджрд▓реЗ рдореЗрдВ, рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рджреГрд╢реНрдп рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдореЙрдбрд▓ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдорддреМрд░ рдкрд░ рдХреБрдЫ рдореБрдЦреНрдп View рдФрд░ ViewModel рднреА рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдмрд╛рдХреА View рдФрд░ ViewModel рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред



рдЪрд░рдг 1. рдЖрд╡реЗрджрди рдлреНрд░реЗрдорд╡рд░реНрдХ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, TabControl рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рдПрдХ TabItem рдпреБрдХреНрдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ - рд╣рд╛рд▓ рд╣реА рдореЗрдВред рд╣рдо MVVM рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗред

рдЖрдЗрдП рдПрдХ рдирдпрд╛ WPF рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВред MainWindow рд╡рд┐рдВрдбреЛ рдореЗрдВ, TabControl рдЬреЛрдбрд╝реЗрдВ:



<TabControl Height="400"

HorizontalAlignment="Left"

Name="Tabs"

VerticalAlignment="Top" Width="300">

/>









рдпрд╣ рд╡рд┐рдВрдбреЛ рд╡реНрдпреВ рдХрд╛ рдореБрдЦреНрдп рддрддреНрд╡ рд╣реЛрдЧрд╛ред рдпрд╣ рдЕрдиреНрдп рд╕рднреА рддрддреНрд╡реЛрдВ (tabItems) рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд ViewModel рд╡рд░реНрдЧ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЗрд╕рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдореБрдЦреНрдп рд╣реЛрдЧрд╛ред рдпрд╣ рдЗрд╕рдореЗрдВ рд╣реИ, рдФрд░ рдореЗрдирд╡рд┐рдВрдбреЛ рдХреЗ рдХреЛрдб рдореЗрдВ рдкреАрдЫреЗ рдирд╣реАрдВ рд╣реИ, рдХрд┐ рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗред рдПрдХ рдирдпрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ SimpleTwitterClientViewModelред рдЗрд╕реЗ рдЕрднреА рдЦрд╛рд▓реА рд╣реЛрдиреЗ рджреЗрдВред рдЕрдм рд╣рдореЗрдВ рд╡рд┐рдВрдбреЛ рдХреНрд▓рд╛рд╕ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреЛ рдкреАрдЫреЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ SimpleTwitterClientViewModel рдореЗрдВ рджреЗрдЦреЗрдВред рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ DataContext рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, ViewModel рдлрд╝реАрд▓реНрдб рдХреЛ рдХреЛрдб рдХреЗ рдкреАрдЫреЗ рдЬреЛрдбрд╝реЗрдВ, рдирд╛рдо рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ DataCotte рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:

<Window x:Class="SimpleTwitterClient.MainWindow"

x:Name="MainWindowInstance"

xmlns:view="clr-namespace:SimpleTwitterClient.View"

xmlns:viewModel="clr-namespace:SimpleTwitterClient.ViewModel"

DataContext="{BindingViewModel,ElementName=MainWindowInstance}">








public partial class MainWindow : Window

{

private SimpleTwitterClientViewModel _viewModel;



public SimpleTwitterClientViewModel ViewModel

{

get { return _viewModel; }

set { _viewModel = value; }

}



public MainWindow()

{

_viewModel = new SimpleTwitterClientViewModel();

InitializeComponent();

}

}






рдЕрдм рд╣рд╛рд▓ рдХреЗ рджреГрд╢реНрдп рдФрд░ ViewModel рдмрдирд╛рдПрдБред рд╣рд╛рд▓ рд╣реА рдХрд╛ рджреГрд╢реНрдп - рдпрд╣ рд╕рд┐рд░реНрдл рдЦрд╛рд▓реА рдХреЛрдб рдХреЗ рд╕рд╛рде UserControl рд╣реЛрдЧрд╛ред рдЦрд╛рд▓реА TabItem рд╕реЗ рдЗрд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХреБрдЫ рдирд┐рдпрдВрддреНрд░рдг рдЬреЛрдбрд╝реЗрдВред рд╣рд╛рд▓ рдХрд╛ рджреГрд╢реНрдпрдореЙрдбрд▓ рдЗрд╕реЗ рдЦрд╛рд▓реА рд░рд╣рдиреЗ рджреЗрдВред

SimpleTwitterClientViewModel рд╡рд╣ рд╡рд░реНрдЧ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ TabItems рдХреЗ рд▓рд┐рдП ViewModel рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред рдЕрднреА рддрдХ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рд╣рд╛рд▓ рд╣реИред рддреЛ рдЪрд▓рд┐рдП рдпрд╣ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

public class SimpleTwitterClientViewModel

{

RecentViewModel _recentPage = new RecentViewModel();



public RecentViewModel RecentPage

{

get { return _recentPage; }

set { _recentPage = value; }

}

}






рдпрджрд┐ рд╣рдо рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрднреА рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЕрдм рддрдХ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ TabItem рдХреЛ рднреА рдмрддрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ? рдпрд╣рд╛рдБ рдПрдХ рд╕реВрдХреНрд╖реНрдо рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИ - рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдХрдВрдЯреЗрдВрдЯ рдХреЛ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

/>





рджреВрд╕рд░реЗ, рдЖрдкрдХреЛ ViewModel рд╕реЗ View рддрдХ рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡реЗ рдХреЛрдб рдЬреЛ рдпрд╣ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ TabItem рдХреА рд╕рд╛рдордЧреНрд░реА рд╣рд╛рд▓ рд╣реА рдореЗрдВ ViewModel рд╣реИ, рддреЛ рд╣рд╛рд▓ рдХреЗ рджреГрд╢реНрдп рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИ:

<Window.Resources>

<DataTemplateDataType="{x:TypeviewModel:RecentViewModel}">

<view:RecentView />







</Window.Resources>

рдЗрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдРрд╕рд╛ рдЖрд╡реЗрджрди рд╣реИ:

рдЫрд╡рд┐

рдРрд╕реА рдореБрд╢реНрдХрд┐рд▓реЗрдВ рдХреНрдпреЛрдВ? рдпрд╣ рдХреЗрд╡рд▓ рд╢реБрд░реБрдЖрдд рд╣реИ, рдлрд┐рд░ рдЬрдм рдЖрд╡реЗрджрди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдк MVVM рдХреЗ рд▓рд╛рднреЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВрдЧреЗред



рдЪрд░рдг 2. рдкрд╣рд▓рд╛ рдЯреНрд╡реАрдЯ


рд╣рдорд╛рд░реЗ рд╣рд╛рд▓рд┐рдпрд╛ рдкреЗрдЬ рдХреЛ рдбреЗрдЯрд╛, рдЙрди рдирд╡реАрдирддрдо рдЯреНрд╡реАрдЯреНрд╕ рд╕реЗ рднрд░реЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо TweetSharp рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕реЗ рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред

рдЯреНрд╡рд┐рдЯрд░ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдзреЛрдЦрд╛рдзрдбрд╝реА рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

1. ConsumerKey рдФрд░ ConsumerSecretред Http://dev.twitter.com/ рд▓рд┐рдВрдХ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╡рд╛рд▓рд╛ рдПрдХ рдкреГрд╖реНрда рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рд╡рд╣рд╛рдВ рд╕реЗ ConsumerKey рдФрд░ ConsumerSecret рд▓реЗ рдЬрд╛рдПрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВред

2. рдкрд┐рди (oauth_verifier)ред рдЬрдм рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд╣рд▓реА рдмрд╛рд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╕рд░реНрд╡рд░ рдХреЛ ConsumerSecret рдФрд░ ConsumerKey рдпреБрдХреНрдд рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдП:

FluentTwitter.SetClientInfo(

new TwitterClientInfo

{

ConsumerKey = Settings.Default.ConsumerKey,

ConsumerSecret = Settings.Default.ConsumerSecret

});



var twit = FluentTwitter.CreateRequest().Authentication.GetRequestToken();



var response = twit.Request();



var RequestToken = response.AsToken();

twit = twit.Authentication.AuthorizeDesktop(RequestToken.Token);






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

string verifier = getPinFromUser();





3. рдПрд╕реНрдХреЛрдЯреЛрдХрдиред рдЕрдм рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ рдЬрд┐рд╕рдореЗрдВ ConsumerKey, ConsumerSecret рдФрд░ Pin рд╣реЛрдВред рд╕реЗрд╡рд╛ рдПрдХ AccessToken рд▓реМрдЯреЗрдЧреА рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

twit.Authentication.GetAccessToken(RequestToken.Token, verifier);

var response2 = twit.Request();






4. рдЕрдкрдиреЗ AccessToken рдХреЛ рд░рд┐рдлреНрд░реЗрд╢ рдХрд░реЗрдВред рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рд╕реЗрд╡рд╛ AccessToken рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддреА рд╣реИред



рдореЙрдбрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ OAuthHandler рд╡рд░реНрдЧ рдЬреЛрдбрд╝реЗрдВред рд╡рд╣рд╛рдВ UserControl AskPinFromUserDialog рдЬреЛрдбрд╝реЗрдВред рдФрд░ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ, рдЬрдм рдЖрдкрдиреЗ рдЕрдкрдирд╛ рдЖрд╡реЗрджрди рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛, рдЯреНрд╡рд┐рдЯрд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд ConsumerKey, ConsumerSecret рдХреЛ рдЬреЛрдбрд╝реЗрдВред рд╡рд╣рд╛рдБ OauthInfoFileName рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рд▓рд┐рдЦреЗрдВред рдЯреНрд╡рд┐рдЯрд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рд╡рд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдмрд╣реБрдд рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░рд▓ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдореБрдЦреНрдп ViewModel рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдЬреЛрдбрд╝реЗрдВ:

Model.OAuthHandler _oauthHandler = newModel.OAuthHandler();





рдЕрдм рдЖрдк рд╣рд╛рд▓ рд╣реА рдХреЗ рдкреЗрдЬреЗрдЬ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рд╛рд▓ рдХреЗрдкреЗрдЬ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рдЯреНрд╡реАрдЯ рд╕реНрдЯреЛрд░реЗрдЬ рдХрдВрдЯреЗрдирд░ рдЬреЛрдбрд╝реЗрдВ:



public ObservableCollection Tweets

{

get; set;

}



ObservableCollection, - List View, .

. - _oauthHandler ViewModel. RecentViewModel, _oauthHandler .

, _oauthHandler , .

. LoadTweets RecentViewModel:

public void LoadTweets()

{

TwitterResult response = FluentTwitter

.CreateRequest()

.AuthenticateWith(

Settings.Default.ConsumerKey,

Settings.Default.ConsumerSecret,

Model.OAuthHandler.Token,

Model.OAuthHandler.TokenSecret)

.Statuses()

.OnHomeTimeline().AsJson().Request());



var statuses = response.AsStatuses();

foreach (TwitterStatus status in statuses)

{

Tweets.Add(status);

}

}







RecentViewModel:

public RecentViewModel(Model.OAuthHandleroauthHandler)

{

_oauthHandler = oauthHandler;

Tweets = newObservableCollection();

LoadTweets();

}



ListBox :

<ListBoxx:Name="RecentTweetList"

ItemsSource="{Binding Path=Tweets}"

IsSynchronizedWithCurrentItem="True"/>







, TweetStatus.ToString(). , ListBox , TweetStatus. , , DataTemplate UserControl.Resources. DataTemplate , TweetStatus. , TweetStatus Text, Binding Path=Text.

DataTemplate:



<DataTemplate x:Key="TweetItemTemplate">

<Grid x:Name="TTGrid">

<Grid.RowDefinitions>

/>

/>

</Grid.RowDefinitions>

<Grid.ColumnDefinitions>

/>

/>

/>

</Grid.ColumnDefinitions>

<Image Source="{Binding Path=User.ProfileImageUrl}"

Name="UserAvatarImage" />

<TextBlock

Name="ScreenNameTextBlock"

Text="{Binding Path=User.ScreenName}"

Grid.Row="1"Grid.ColumnSpan="2"/>

<TextBlock

Text="{Binding Path=Text}"

TextWrapping="Wrap"Grid.Column="1"Grid.ColumnSpan="2" />



















рдЕрдм рдШреЛрд╖рд┐рдд DataTemplate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рд╕реВрдЪреА рдмреЙрдХреНрд╕ рдХреЛ рдмрддрд╛рдПрдВ:

ItemTemplate="{StaticResourceTweetItemTemplate}"





рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдЕрдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

рдЫрд╡рд┐



рдЪрд░рдг 3. рдирдП рдкреГрд╖реНрда


рд╣рд╛рд▓ рдХрд╛ рдЯреИрдм рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдП рдЧрдП рдЕрдВрддрд┐рдо рдЯреНрд╡реАрдЯреНрд╕ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЖрдкрдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЯреНрд╡реАрдЯ рднреАред TweetSharp рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ HomeTimeline рд╣реИред рд▓реЗрдХрд┐рди рдпреЗ рд╕рднреА рдЯреНрд╡реАрдЯ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреА рд░реБрдЪрд┐ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк TwitterStatusesExtensions рдХреНрд▓рд╛рд╕ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ OnHomeTimeline рдкрджреНрдзрддрд┐ рдШреЛрд╖рд┐рдд рдХреА рдЧрдИ рд╣реИ, рддреЛ рдЖрдк рдЕрдиреНрдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдирджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣реАрдХреГрдд рдЯреНрд╡реАрдЯреНрд╕ рдХреА рд╕реВрдЪреА рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦреЗрдВрдЧреЗ: OnFriendsTimeline, OnListTimeline, REMByMe ...

рдПрдХ рдкреЗрдЬ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрд╛ рд░реАрдЯреНрд╡реАрдЯ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд╕рдорд╛рди, рдПрдХ рд░рд┐рдЯреНрд░реАрд╡реНрдпреВ рд╡реНрдпреВрдХреЛрдб рдмрдирд╛рдПрдБред рдореИрдВ рдЙрдирдХреЗ рдХреЛрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдкрд╛рдардХ рдХреЛ рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдВред рдЖрдк рдпрд╣ рднреА рджреЗрдЦреЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрддрд╛ рд╣реИ? рд╣рдореНрдо, рд▓реЗрдХрд┐рди рд╣рд╛рд▓ рдФрд░ рд░рд┐рдЯрд░реНрдиреНрд╕ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реИред MVVM рдФрд░ WPF рдХреЙрдкреА-рдкрд╛рд╕реНрдЯ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реЗ рдЕрднреА рддрдХ рд░рд┐рдЯреНрд╡реАрдЯреНрд╕ рд╡реНрдпреВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВред рдЪрд░рдг 3 рдХреЗ рдЕрдВрдд рдореЗрдВ, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИред

рдЕрдм рд╣рдореЗрдВ рдореБрдЦреНрдп ViewModel рдореЗрдВ RetweetsViewModel рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рджреЛ рдкреГрд╖реНрда рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдХрдИ рдкреЗрдЬ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рддреЛ рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЦреНрдп ViewModel рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди ViewModel рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ RetweetsViewModel рд╣рд╛рд▓ рд╣реА рдХреЗViewModel рдХреЗ рд╕рдорд╛рди рд╣реИ рдФрд░ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдХреНрд▓рд╛рд╕ рд╕реЗ рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо OauthHandler рдХреЛ рдЧреБрдгреЛрдВ рдореЗрдВ рднреА рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдЗрд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдХрд░реЗрдВрдЧреЗред IPageBase рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ:



public interface IPageBase

{

void LoadTweets();

ObservableCollection Tweets { get; set; }

}





ViewModel:

ObservableCollection _pages;



public ObservableCollection Pages

{

get { return _pages; }

set { _pages = value; }

}



public SimpleTwitterClientViewModel()

{

_pages = new ObservableCollection();

_pages.Add(new RecentViewModel());

_pages.Add(new RetweetsViewModel());

foreach (var page in _pages)

{

page.LoadTweets();

}

}



View DataTemplate RetweetsPage. TabItem тАУ tabItem ViewModel RecentPage:

/>






TabItems Pages. TabControl ItemsSource. Pages TabItems тАУ Pages. тАУ TabItems Header. header TabItems? Name IPageBase. -. , TabItem Header:



<TabControlName="Tabs"

ItemsSource="{Binding Pages}">

<TabControl.ItemContainerStyle>



</TabControl.ItemContainerStyle>









тАУ RetweetsViewModel View. RetweetsView. RecentView! MVVM!

<DataTemplateDataType="{x:TypeviewModel:RetweetsViewModel}">

<view:RecentView />









. :

рдЫрд╡рд┐

DataTemplate тАУ ViewModel .

тАУ follower & following.



4. ICommand

, . MVVM тАУ OnMouseClick. . , . TextBox , :

рдЫрд╡рд┐

code behind тАУ EnterTweetTextBox.Text. MVVM . ViewModel , Send. , .

, EnterTweetTextBox . SimpleTwitterClientViewModel тАУ Message. Text:

<TextBoxName="EnterTweetTextBox"

Text="{BindingMessage}"/>







SendTweet SimpleTwitterClientViewModel:

private void SendTweet()

{

var twitter = FluentTwitter.CreateRequest();

twitter.AuthenticateWith(

Settings.Default.ConsumerKey,

Settings.Default.ConsumerSecret,

OAuthHandler.Token,

OAuthHandler.TokenSecret);

twitter.Statuses().Update(Message);



var response = twitter.Request();

//you can verify the response here

}







тАУ ? тАУ Button Command, . ICommand. SendMessage, , . ? тАУ -adapter ICommand. Josh Smith:

internal class RelayCommand : ICommand

{

#region Fields



readonly Action _execute;

readonly Func _canExecute;



#endregion



#region Constructors



public RelayCommand(Action execute)

: this(execute, null)

{

}



public RelayCommand(Action execute, Func canExecute)

{

if (execute == null)

throw new ArgumentNullException("execute");



_execute = execute;

_canExecute = canExecute;

}



#endregion // Constructors



#region ICommand Members



[DebuggerStepThrough]

public bool CanExecute(object parameter)

{

return _canExecute == null ? true : _canExecute();

}



public event EventHandler CanExecuteChanged

{

add

{

if (_canExecute != null)

CommandManager.RequerySuggested += value;

}

remove

{

if (_canExecute != null)

CommandManager.RequerySuggested -= value;

}

}



public void Execute(object parameter)

{

_execute();

}



#endregion // ICommand Members

}



RelayCoommand ICommand. , SendTweet ICommand:

RelayCommand _sendCommand;

public ICommand SendCommand

{

get

{

if (_sendCommand == null)

{

_sendCommand = new RelayCommand(() => this.SendTweet());

}

return _sendCommand;

}

}







, SendButton , SendCommand:

<Button Name="SendTweetButton"

Command="{Binding SendCommand}"/>






, ? :

рдЫрд╡рд┐

, тАУ .

, feature: userpicture, TabItem . TabItem , .















public interface IPageBase

{

void LoadTweets();

ObservableCollection Tweets { get; set; }

}





ViewModel:

ObservableCollection _pages;



public ObservableCollection Pages

{

get { return _pages; }

set { _pages = value; }

}



public SimpleTwitterClientViewModel()

{

_pages = new ObservableCollection();

_pages.Add(new RecentViewModel());

_pages.Add(new RetweetsViewModel());

foreach (var page in _pages)

{

page.LoadTweets();

}

}



View DataTemplate RetweetsPage. TabItem тАУ tabItem ViewModel RecentPage:

/>






TabItems Pages. TabControl ItemsSource. Pages TabItems тАУ Pages. тАУ TabItems Header. header TabItems? Name IPageBase. -. , TabItem Header:



<TabControlName="Tabs"

ItemsSource="{Binding Pages}">

<TabControl.ItemContainerStyle>



</TabControl.ItemContainerStyle>









тАУ RetweetsViewModel View. RetweetsView. RecentView! MVVM!

<DataTemplateDataType="{x:TypeviewModel:RetweetsViewModel}">

<view:RecentView />









. :

рдЫрд╡рд┐

DataTemplate тАУ ViewModel .

тАУ follower & following.



4. ICommand

, . MVVM тАУ OnMouseClick. . , . TextBox , :

рдЫрд╡рд┐

code behind тАУ EnterTweetTextBox.Text. MVVM . ViewModel , Send. , .

, EnterTweetTextBox . SimpleTwitterClientViewModel тАУ Message. Text:

<TextBoxName="EnterTweetTextBox"

Text="{BindingMessage}"/>







SendTweet SimpleTwitterClientViewModel:

private void SendTweet()

{

var twitter = FluentTwitter.CreateRequest();

twitter.AuthenticateWith(

Settings.Default.ConsumerKey,

Settings.Default.ConsumerSecret,

OAuthHandler.Token,

OAuthHandler.TokenSecret);

twitter.Statuses().Update(Message);



var response = twitter.Request();

//you can verify the response here

}







тАУ ? тАУ Button Command, . ICommand. SendMessage, , . ? тАУ -adapter ICommand. Josh Smith:

internal class RelayCommand : ICommand

{

#region Fields



readonly Action _execute;

readonly Func _canExecute;



#endregion



#region Constructors



public RelayCommand(Action execute)

: this(execute, null)

{

}



public RelayCommand(Action execute, Func canExecute)

{

if (execute == null)

throw new ArgumentNullException("execute");



_execute = execute;

_canExecute = canExecute;

}



#endregion // Constructors



#region ICommand Members



[DebuggerStepThrough]

public bool CanExecute(object parameter)

{

return _canExecute == null ? true : _canExecute();

}



public event EventHandler CanExecuteChanged

{

add

{

if (_canExecute != null)

CommandManager.RequerySuggested += value;

}

remove

{

if (_canExecute != null)

CommandManager.RequerySuggested -= value;

}

}



public void Execute(object parameter)

{

_execute();

}



#endregion // ICommand Members

}



RelayCoommand ICommand. , SendTweet ICommand:

RelayCommand _sendCommand;

public ICommand SendCommand

{

get

{

if (_sendCommand == null)

{

_sendCommand = new RelayCommand(() => this.SendTweet());

}

return _sendCommand;

}

}







, SendButton , SendCommand:

<Button Name="SendTweetButton"

Command="{Binding SendCommand}"/>






, ? :

рдЫрд╡рд┐

, тАУ .

, feature: userpicture, TabItem . TabItem , .















public interface IPageBase

{

void LoadTweets();

ObservableCollection Tweets { get; set; }

}





ViewModel:

ObservableCollection _pages;



public ObservableCollection Pages

{

get { return _pages; }

set { _pages = value; }

}



public SimpleTwitterClientViewModel()

{

_pages = new ObservableCollection();

_pages.Add(new RecentViewModel());

_pages.Add(new RetweetsViewModel());

foreach (var page in _pages)

{

page.LoadTweets();

}

}



View DataTemplate RetweetsPage. TabItem тАУ tabItem ViewModel RecentPage:

/>






TabItems Pages. TabControl ItemsSource. Pages TabItems тАУ Pages. тАУ TabItems Header. header TabItems? Name IPageBase. -. , TabItem Header:



<TabControlName="Tabs"

ItemsSource="{Binding Pages}">

<TabControl.ItemContainerStyle>



</TabControl.ItemContainerStyle>









тАУ RetweetsViewModel View. RetweetsView. RecentView! MVVM!

<DataTemplateDataType="{x:TypeviewModel:RetweetsViewModel}">

<view:RecentView />









. :

рдЫрд╡рд┐

DataTemplate тАУ ViewModel .

тАУ follower & following.



4. ICommand

, . MVVM тАУ OnMouseClick. . , . TextBox , :

рдЫрд╡рд┐

code behind тАУ EnterTweetTextBox.Text. MVVM . ViewModel , Send. , .

, EnterTweetTextBox . SimpleTwitterClientViewModel тАУ Message. Text:

<TextBoxName="EnterTweetTextBox"

Text="{BindingMessage}"/>







SendTweet SimpleTwitterClientViewModel:

private void SendTweet()

{

var twitter = FluentTwitter.CreateRequest();

twitter.AuthenticateWith(

Settings.Default.ConsumerKey,

Settings.Default.ConsumerSecret,

OAuthHandler.Token,

OAuthHandler.TokenSecret);

twitter.Statuses().Update(Message);



var response = twitter.Request();

//you can verify the response here

}







тАУ ? тАУ Button Command, . ICommand. SendMessage, , . ? тАУ -adapter ICommand. Josh Smith:

internal class RelayCommand : ICommand

{

#region Fields



readonly Action _execute;

readonly Func _canExecute;



#endregion



#region Constructors



public RelayCommand(Action execute)

: this(execute, null)

{

}



public RelayCommand(Action execute, Func canExecute)

{

if (execute == null)

throw new ArgumentNullException("execute");



_execute = execute;

_canExecute = canExecute;

}



#endregion // Constructors



#region ICommand Members



[DebuggerStepThrough]

public bool CanExecute(object parameter)

{

return _canExecute == null ? true : _canExecute();

}



public event EventHandler CanExecuteChanged

{

add

{

if (_canExecute != null)

CommandManager.RequerySuggested += value;

}

remove

{

if (_canExecute != null)

CommandManager.RequerySuggested -= value;

}

}



public void Execute(object parameter)

{

_execute();

}



#endregion // ICommand Members

}



RelayCoommand ICommand. , SendTweet ICommand:

RelayCommand _sendCommand;

public ICommand SendCommand

{

get

{

if (_sendCommand == null)

{

_sendCommand = new RelayCommand(() => this.SendTweet());

}

return _sendCommand;

}

}







, SendButton , SendCommand:

<Button Name="SendTweetButton"

Command="{Binding SendCommand}"/>






, ? :

рдЫрд╡рд┐

, тАУ .

, feature: userpicture, TabItem . TabItem , .
















All Articles