рдлрд░рд╡рд░реА 2019 рдиреЗ ReactiveUI 9 рдХреА рд░рд┐рд▓реАрдЬ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ - Microsoft .NET рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ GUI рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдлреНрд░реЗрдорд╡рд░реНрдХред ReactiveUI MVVM рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рддрдВрдЧ рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рд╣реИред рдЖрдк рд╡реАрдбрд┐рдпреЛ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдпрд╛ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕реНрд╡рд╛рдЧрдд рдкреГрд╖реНрда рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ReactiveUI 9 рдЕрдкрдбреЗрдЯ рдореЗрдВ рдХрдИ рдлрд┐рдХреНрд╕реЗрд╕ рдФрд░ рд╕реБрдзрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ , рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдбрд╛рдпрдиреЗрдорд┐рдХрдбрд╛рдЯрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг , рдЬреЛ рдЖрдкрдХреЛ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдлреИрд╢рди рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреЗ рд▓рд┐рдП рдбрд╛рдпрдиреЗрдорд┐рдХрдбрд╛рдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдпрд╣ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд░реВрдкрд░реЗрдЦрд╛ рдХреИрд╕реЗ рд╣реБрдб рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддреА рд╣реИ!
рдкрд░рд┐рдЪрдп
рдЖрдЗрдП рдкрд╣рд▓реЗ рдбрд╛рдпрдирд╛рдореИрдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдореЗрдВ System.Collections.ObjectModel
рдирд╛рдо рд╕реНрдерд╛рди рд╕реЗ рдбрд╛рдпрдиреЗрдорд┐рдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред
MVVM рдЯреЗрдореНрдкреНрд▓реЗрдЯ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдореЙрдбрд▓ рд▓реЗрдпрд░, рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди рд▓реЗрдпрд░ рдФрд░ рдРрдк рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди рдореЙрдбрд▓ рдХреЗ рдмреАрдЪ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЗ рд╡рд┐рднрд╛рдЬрди рдХреЛ рдорд╛рдирддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡реНрдпреВ рдореЙрдбрд▓ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдореЙрдбрд▓ рдкрд░рдд рдХреЛ рдбреЛрдореЗрди рд╕рдВрд╕реНрдерд╛рдУрдВ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджреГрд╢реНрдп рдореЙрдбрд▓ рдкрд░рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИред рдореЙрдбрд▓ рдРрдк рдХреЗ рд╕рдВрдкреВрд░реНрдг рдЬрдЯрд┐рд▓ рддрд░реНрдХ рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рджреГрд╢реНрдп рдореЙрдбрд▓ рдореЙрдбрд▓ рдХреЛ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рджреГрд╢реНрдп рдХреЗ рдЧреБрдгреЛрдВ, рдЖрджреЗрд╢реЛрдВ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдРрдк рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдбрд╛рдпрдиреЗрдорд┐рдХ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЙрдкрдХрд░рдг INotifyCollectionChanged
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - INotifyCollectionChanged
, рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - INotifyCollectionChanged
рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рд╕рд╛рде рд╣реА рдРрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЬреИрд╕реЗ ObservableCollection<T>
рдФрд░ ReadOnlyObservableCollection<T>
ред

INotifyPropertyChanged
рдФрд░ ICommand
рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрдорддреМрд░ рдкрд░ рдбреЗрд╡рд▓рдкрд░ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП MVVM рдлреНрд░реЗрдорд╡рд░реНрдХ рддрдХ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ ObservableCollection<T>
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рд╕реАрдорд╛рдПрдВ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ! рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо Dispatcher.Invoke
рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХреЙрд▓ рдХреЗ рдмрд┐рдирд╛ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдереНрд░реЗрдб рд╕реЗ рдХрд▓реЗрдХреНрд╢рди рдХреЛ рдореНрдпреВрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬреЛ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдСрдкрд░реЗрд╢рди рдХреЗ рдЬрд░рд┐рдП рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░ рдЙрдкрдпреЛрдЧреА рд░рд╣рд╛ рд╣реЛрдЧрд╛ред рд╡рд░реНрде рдиреЛрдЯрд┐рдВрдЧ, рдХрд┐ рд╕рд╛рдл MVVM рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдореЙрдбрд▓ рд▓реЗрдпрд░ рдХреЛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП GUI рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ MVC рдпрд╛ MVP рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдореЙрдбрд▓ рд▓реЗрдпрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЙрди рдХрдИ Dispatcher.Invoke
рдбреЛрдореЗрди рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдЕрд▓рдЧрд╛рд╡ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ рд╣реИрдВред
рдмреЗрд╢рдХ, рд╣рдо рдПрдХ рдбреЛрдореЗрди рд╕реЗрд╡рд╛ рдореЗрдВ рдПрдХ рдШрдЯрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдШрдЯрдирд╛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЖрдЗрдЯрдо рдХреЗ рд╕рд╛рде рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ, Dispatcher.Invoke
рдХреЛ Dispatcher.Invoke
рдХрд░реЗрдВред рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреАрдЫреЗ рдХреЙрд▓ рдХрд░реЗрдВ, рддрд╛рдХрд┐ рд╣рдорд╛рд░рд╛ рдРрдк рдХрд┐рд╕реА рднреА GUI рдкрд░ рдирд┐рд░реНрднрд░ рди рд╣реЛред рдлреНрд░реЗрдорд╡рд░реНрдХ, рдЙрд╕ рдореЙрдбрд▓ рдХреЛ рд╡реНрдпреВ рдореЙрдбрд▓ рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдЙрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ ObservableCollection<T>
рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд┐рдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдореБрджреНрджреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рддрд░реАрдХрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдХрд┐рд╕ рдЪреАрдЬ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╡рд┐рд╕реНрддрд╛рд░ред рдЕрд╡рд▓реЛрдХрди рдбреЗрдЯрд╛ рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛
рдбрд╛рдпрдиреЗрдорд┐рдХрдбрд╛рдЯрд╛ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рд╕рд╛рд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рдЖрдЗрдП рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ Microsoft .NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдФрд░ MVVM рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ ред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ (рдкреБрд▓-рдЖрдзрд╛рд░рд┐рдд, рдЯреА, рдЖрдИрдиреНрдпреВрдорд░реЗрдмрд▓) рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдирд┐рд░реНрдорд╛рддрд╛ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕рд▓реА (рдкреБрд╢-рдЖрдзрд╛рд░рд┐рдд, рдЯрд╛рд╕реНрдХ, IOervable) рдбреЗрдЯрд╛ рднреЗрдЬрддрд╛ рд╣реИред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбреЗрдЯрд╛ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдиреЗрдорд╕реНрдкреЗрд╕ рд╕реЗ IObservable
рдФрд░ IObserver
рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, IObserver
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ IObservable
рдЬреИрд╕реЗ рдСрдкрд░реЗрд╢рди рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ IObservable
, рдЬрд┐рдиреНрд╣реЗрдВ IObservable
рдкрд░ LINQ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди .NET рдорд╛рдирдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╣рд╛рдБ рднреА Microsoft .NET рдЪрд▓рд╛рддрд╛ рд╣реИред

ReactiveUomm ReactiveCommand<TIn, TOut>
рдФрд░ WhenAnyValue
рдЬреИрд╕реЗ рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рдХреЗ, ReactiveCommand<TIn, TOut>
рдФрд░ WhenAnyValue
рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд▓рд╛рдн рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред WhenAnyValue
рдЖрдкрдХреЛ рдПрдХ рд╡рд░реНрдЧ рдХреА рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ WhenAnyValue
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ IObservable<T>
рдЗрд╡реЗрдВрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд░реНрднрд░ рдЧреБрдгреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред
public class ExampleViewModel : ReactiveObject { [Reactive]
ReactiveCommand<TIn, TOut>
рдЖрдкрдХреЛ IObservable<TOut>
рд╕рд╛рде рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЬрдм рднреА рдХреЛрдИ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрди рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рддрдм рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд┐рд╕реА рднреА рдХрдорд╛рдВрдб рдореЗрдВ IObservable<Exception>
рдкреНрд░рдХрд╛рд░ рдХреА ThrownExceptions
рд╕рдВрдкрддреНрддрд┐ рд╣реИред
рдЗрд╕ рд╕рдордп рддрдХ, рд╣рдо IObservable<T>
рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдПрдХ рдШрдЯрдирд╛ рдХреЗ рд╕рд╛рде рдЬреЛ рдЯрд╛рдЗрдк T
рдХрд╛ рдПрдХ рдирдпрд╛ рдорд╛рди рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдм рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, IObservable<T>
рдШрдЯрдирд╛рдУрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рд╣реИ, рд╕рдордп рдореЗрдВ рдлреИрд▓рд╛ рд╣реБрдЖ рдкреНрд░рдХрд╛рд░ T
рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ред
рдмреЗрд╢рдХ, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЬрдм рднреА рдХреЛрдИ рд╕рдВрдЧреНрд░рд╣ рдмрджрд▓рддрд╛ рд╣реИ, рд╣рдо рдмрджрд▓реЗ рд╣реБрдП рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреНрд░рдХрд╛рд╢рд┐рдд рдорд╛рди IEnumerable<T>
рдпрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдзрд╛рд░рд╛ рд╕реНрд╡рдпрдВ IObservable<IEnumerable<T>>
рдкреНрд░рдХрд╛рд░ рдХреА IObservable<IEnumerable<T>>
ред рд▓реЗрдХрд┐рди, рдПрдХ рдЖрд▓реЛрдЪрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдорди-рдореБрддрд╛рдмрд┐рдХ рдкрд╛рдардХ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рдореБрджреНрджреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдПрдХ рджрд░реНрдЬрди рддрддреНрд╡ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реМ, рдпрд╛ рдХреБрдЫ рд╣рдЬрд╛рд░ рднреА!
рдбрд╛рдпрдирд╛рдореИрдЯрдбрд╛рдЯрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп
рдбрд╛рдпрдирд╛рдореИрдбрд╛рдЯрд╛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрд░рдПрдХреНрд╕ рдмреЗрд╣рдж рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЙрдЯ рдСрдл рдж рдмреЙрдХреНрд╕ рд╕рдВрдЧреНрд░рд╣ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рд╕рд╣рд╛рдпрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдбрд╛рдпрдиреЗрдорд┐рдХрдбрд╛рдЯрд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рддрд╛ рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдЖрдорддреМрд░ рдкрд░, рд╕рдВрдЧреНрд░рд╣ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд░реНрд╡рд░ рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдЖрдзреБрдирд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИрдВ, рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЕрдиреБрдорд╛рдиреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ - рдлрд╝рд┐рд▓реНрдЯрд░, рдкрд░рд┐рд╡рд░реНрддрди, рдпрд╛ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдирд╛ред рдбрд╛рдпрдиреЗрдорд┐рдХрдбрд╛рдЯрд╛ рдХреЛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдХреЛрдб рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрджрд▓рддреЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЙрдкрдХрд░рдг рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рдкрд░рд┐рд╖реНрдХреГрдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЕрдм 60 рд╕реЗ рдЕрдзрд┐рдХ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдбрд╛рдпрдиреЗрдорд┐рдХрдбрд╛рдЯрд╛ ObservableCollection<T>
рдХрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИред рдбрд╛рдпрдирд╛рдореИрдЯрдбрд╛рдЯрд╛ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдбреЛрдореЗрди-рд╕рдВрдЪрд╛рд▓рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЙрдкрдпреЛрдЧ рдХреА рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдФрд░ рдореНрдпреВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдорджрдж рд╕реЗ рдЖрдк рдбреЗрдЯрд╛ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдиреНрдп рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдиреЗ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдбрд╛рдпрдиреЗрдорд┐рдХрдбрд╛рдЯрд╛ рдХреЗ рд╕рд╛рде рдЖрдк рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рддрд░реАрдХреЗ рд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ - рдЗрд╕рд▓рд┐рдП, рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╕рдВрдЧреНрд░рд╣ рд╣рдореЗрд╢рд╛ рд╕реНрд░реЛрдд рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд░рд╣реЗрдЧрд╛ред
рдХреНрд▓рд╛рд╕рд┐рдХ IObservable<T>
рдмрдЬрд╛рдп, IObservable<IChangeSet<T>>
рдФрд░ IObservable<IChangeSet<TValue, TKey>>
, IChangeSet
IObservable<IChangeSet<TValue, TKey>>
, рдкрд░ рдСрдкрд░реЗрд╢рдиреНрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ IChangeSet
рдПрдХ рдЪрдВрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкреНрд░рдХрд╛рд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдФрд░ рдкреНрд░рднрд╛рд╡рд┐рдд рддрддреНрд╡ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдк рд╣рдореЗрд╢рд╛ IObservable<IChangeSet<T>>
рдХреЛ IObservable<IEnumerable<T>>
, рдЕрдЧрд░ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ - рдЪрд┐рдВрддрд╛ рдордд рдХрд░реЛ, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреЗрдВрдЧреЗ!
рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдбреЗрдЯрд╛
рдЖрдЗрдП рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдбрд╛рдпрдирд╛рдорд╛рдбрд╛рдЯрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдФрд░ рдЬреАрдпреВрдЖрдИ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд┐рд╕ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪрд▓рд┐рдП GitHub рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдПрдХ рд╡реНрдпрд╛рдкрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд SourceCache<Trade, long>
рд▓реЗрди-рджреЗрди рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рд▓рдХреНрд╖реНрдп рдХреЗрд╡рд▓ рд╕рдХреНрд░рд┐рдп рд▓реЗрдирджреЗрди рджрд┐рдЦрд╛рдирд╛ рд╣реИ, рдореЙрдбрд▓ рдХреЛ рдкреНрд░реЙрдХреНрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрджрд▓рдирд╛, рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдирд╛ рд╣реИред
рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЬрдм SourceCache
рдЬреЛ рдХрд┐ рдбреЗрдЯрд╛ рдХрд╛ рд╕реНрд░реЛрдд рд╣реИ, рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп ReadOnlyObservableCollection
рднреА рддрджрдиреБрд╕рд╛рд░ рдмрджрд▓рддрд╛ рд░рд╣рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдЖрдЗрдЯрдо рдирд┐рдХрд╛рд▓рддреЗ рд╕рдордп, Dispose
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╕рдВрдЧреНрд░рд╣ рд╣рдореЗрд╢рд╛ GUI рдереНрд░реЗрдб рд╕реЗ рдХреЗрд╡рд▓ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕реЙрд░реНрдЯ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреВрд▓, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ Dispatcher.Invoke
рдирд╣реАрдВ рд╣реИред рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдХреЛрдб рд╕рд░рд▓ рдФрд░ рдкрдардиреАрдп рд╣реИ!
рдбреЗрдЯрд╛ рд╕реНрд░реЛрддред SourceList рдФрд░ SourceCache
рдбрд╛рдпрдиреЗрдорд┐рдХрдбрд╛рдЯрд╛ рджреЛ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рдкрд░рд╕реНрдкрд░ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпреЗ рд╕рдВрдЧреНрд░рд╣ SourceList<TObject>
SourceCache<TObject, TKey>
SourceList<TObject>
рдФрд░ SourceCache<TObject, TKey>
ред рдЬрдм рднреА SourceCache
рдкрд╛рд╕ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдХреБрдВрдЬреА рд╣реЛ, рддреЛ SourceCache
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрдиреНрдпрдерд╛ SourceList
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП .NET рдбреЗрд╡рд▓рдкрд░реНрд╕ API рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд┐рдд рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ - рдЬреИрд╕реЗ рдХрд┐ Add
, Remove
, Insert
ред рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рдХреЛ IObservable<IChangeSet<T>>
рдпрд╛ IObservable<IChangeSet<T, TKey>>
рдореЗрдВ .Connect()
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП .Connect()
рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдРрд╕реА рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рд╕рдордп-рд╕рдордп рдкрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреА рд╣реИ, рддреЛ рдЖрдк Dispatcher.Invoke
рдмрд┐рдирд╛ рдЬреАрдпреВрдЖрдИ рдХреЗ рд╕рд╛рде рдЗрди рдорджреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Dispatcher.Invoke
рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб:
public class BackgroundService : IBackgroundService {
рд╢рдХреНрддрд┐рд╢рд╛рд▓реА IObservable<IChangeSet<Trade>>
рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдорджрдж рд╕реЗ, рд╣рдо рдЕрдкрдиреЗ рджреГрд╢реНрдп рдореЙрдбрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд IObservable<IChangeSet<Trade>>
рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
public class TradesViewModel : ReactiveObject { private readonly ReadOnlyObservableCollection<TradeVm> _trades; public ReadOnlyObservableCollection<TradeVm> Trades => _trades; public TradesViewModel(IBackgroundService background) {
Transform
, Filter
рдФрд░ Sort
рдСрдкрд░реЗрдЯрд░реНрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбрд╛рдпрдиреЗрдорд┐рдХрдбрд╛рдЯрд╛ рдЧреНрд░реБрдкрд┐рдВрдЧ, рд▓реЙрдЬрд┐рдХрд▓ рдСрдкрд░реЗрд╢рдВрд╕, рдХрд▓реЗрдХреНрд╢рди рдлреНрд▓реИрдЯрд┐рдВрдЧ, рдПрдЧреНрд░реЗрд╕рд┐рд╡ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ, рд╕рдорд░реВрдк рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдХреЗ рдПрд▓рд┐рдорд┐рдиреЗрд╢рди, рдПрд▓рд┐рдореЗрдВрдЯ рдХрд╛рдЙрдВрдЯрд┐рдВрдЧ рдФрд░ рд╡реНрдпреВ рдореЙрдбрд▓ рд▓реЗрд╡рд▓ рдкрд░ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рднреА рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред рдЖрдк GitHub рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА README рдореЗрдВ рд╕рднреА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

SourceList
рдФрд░ SourceCache
рдЕрд▓рд╛рд╡рд╛, SourceCache
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдореНрдпреВрдЯреЗрдмрд▓ рд╕рдВрдЧреНрд░рд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди - SourceCache
рд╢рд╛рдорд┐рд▓ рд╣реИред рдЕрдкрдиреЗ рджреГрд╢реНрдп рдореЙрдбрд▓ рдореЗрдВ рджреЛ рд╕рдВрдЧреНрд░рд╣реЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ ToObservableChangeSet
рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ, рдФрд░ рджреВрд╕рд░реЗ рдХреЛ ReadOnlyObservableCollection
рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ ToObservableChangeSet
рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреЛ рдХрдиреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди ToObservableChangeSet
рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред
рдбрд╛рдпрдирд╛рдореИрдбрд╛рдЯрд╛ рдЙрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рднреА рдХрд░рддрд╛ рд╣реИ рдЬреЛ INotifyPropertyChanged
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ AutoRefresh
рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдкрддреНрддрд┐ рдЪрдпрдирдХрд░реНрддрд╛ рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВред AutoRefresh
рдФрд░ рдЕрдиреНрдп AutoRefresh
рдСрдкрд░реЗрдЯрд░ рдЖрдкрдХреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд░реВрдк рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рд░реВрдкреЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЕрдирд╛рдпрд╛рд╕ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ!
рдЖрдк рдбрд╛рдпрдиреЗрдорд┐рдХрдбрд╛рдЯрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрдЯрд┐рд▓ рдпреВрдЖрдИ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддрддреНрдХрд╛рд▓ рдореИрд╕реЗрдЬрд┐рдВрдЧ рдРрдк рдФрд░ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЬреИрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖
ReactiveX рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЗрд╡реЗрдВрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдФрд░ UI рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдкреЛрд░реНрдЯреЗрдмрд▓ рдФрд░ рдореЗрдВрдЯреЗрдиреЗрдВрд╕ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд░рд▓ рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред ReactiveUI, .NET рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ INotifyCollectionChanged
рдХреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде MVVM рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ INotifyCollectionChanged
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдЦреНрдпрд╛рд▓ INotifyCollectionChanged
, рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред
ReactiveUI рдФрд░ DynamicData рд▓рд╛рдЗрдмреНрд░реЗрд░реА .NET рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рд╕рднреА GUI рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдЧрдд рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ Windows Presentation Foundation, Universal Windows Platform, Avalonia , Xamarin.Android, Xamarin Forms рдФрд░ Xamarin iOS рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЖрдк ReactiveUI рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреГрд╖реНрда рдкрд░ рдбрд╛рдпрдирд╛рдореИрдбрд╛рдЯрд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбрд╛рдпрдиреЗрдорд╛рдбрд╛рдЯрд╛ рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рднреА рдзреНрдпрд╛рди рд░рдЦреЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреА рдЬрд░реВрд░рдд рдХреА рд▓рдЧрднрдЧ рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдирдореВрдиреЗ рд╣реЛрдВред