рдбрд╛рдпрдиреЗрдорд┐рдХрдбрд╛рдЯрд╛: рдбрд╛рдпрдиреЗрдорд┐рдХ рдХрд▓реЗрдХреНрд╢рдВрд╕, рдПрдорд╡реАрд╡реАрдПрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреНрд╕

рдлрд░рд╡рд░реА 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] // Attribute from the ReactiveUI.Fody package, // takes care of aspect-oriented INPC implementation // for this particular property. public string Name { get; set; } public ExampleViewModel() { // Here we subscribe to OnPropertyChanged("Name") events. this.WhenAnyValue(x => x.Name) // IObservable<string> .Subscribe(Console.WriteLine); } } 

ReactiveCommand<TIn, TOut> рдЖрдкрдХреЛ IObservable<TOut> рд╕рд╛рде рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЬрдм рднреА рдХреЛрдИ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрди рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рддрдм рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд┐рд╕реА рднреА рдХрдорд╛рдВрдб рдореЗрдВ IObservable<Exception> рдкреНрд░рдХрд╛рд░ рдХреА ThrownExceptions рд╕рдВрдкрддреНрддрд┐ рд╣реИред


 // ReactiveCommand<Unit, int> var command = ReactiveCommand.Create(() => 42); command // IObservable<int> .Subscribe(Console.WriteLine); command .ThrownExceptions // IObservable<Exception> .Select(exception => exception.Message) // IObservable<string> .Subscribe(Console.WriteLine); command.Execute().Subscribe(); // Outputs: 42 

рдЗрд╕ рд╕рдордп рддрдХ, рд╣рдо 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> рд▓реЗрди-рджреЗрди рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рд▓рдХреНрд╖реНрдп рдХреЗрд╡рд▓ рд╕рдХреНрд░рд┐рдп рд▓реЗрдирджреЗрди рджрд┐рдЦрд╛рдирд╛ рд╣реИ, рдореЙрдбрд▓ рдХреЛ рдкреНрд░реЙрдХреНрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрджрд▓рдирд╛, рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдирд╛ рд╣реИред


 // The default collection from the System.Collections.ObjectModel // namespace, to which we bind XAML UI controls. ReadOnlyObservableCollection<TradeProxy> list; // The mutable data source, containing the list of transactions. // We can use Add, Remove, Insert and similar methods on it. var source = new SourceCache<Trade, long>(trade => trade.Id); var cancellation = source // Here we transform the data source to an observable change set. .Connect() // Now we have IObservable<IChangeSet<Trade, long>> here. // Filter only active transactions. .Filter(trade => trade.Status == TradeStatus.Live) // Transform the models into proxy objects. .Transform(trade => new TradeProxy(trade)) // No we have IObservable<IChangeSet<TrandeProxy, long>> // Order the trade proxies by timestamp. .Sort(SortExpressionComparer<TradeProxy> .Descending(trade => trade.Timestamp)) // Use the dispatcher scheduler to update the GUI. .ObserveOnDispatcher() // Bind the sorted objects to the collection from the // System.Collections.ObjectModel namespace. .Bind(out list) // Ensure that when deleting elements from the // collections, the resources will get disposed. .DisposeMany() .Subscribe(); 

рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЬрдм 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 { // Declare the mutable data source containing trades. private readonly SourceList<Trade> _trades; // Expose the observable change set to the outside world. // If we have more than one subscriber, it is recommended // to use the Publish() operator from reactive extensions. public IObservable<IChangeSet<Trade>> Connect() => _trades.Connect(); public BackgroundService() { _trades = new SourceList<Trade>(); _trades.Add(new Trade()); // Mutate the source list! // Even from the background thread. } } 

рд╢рдХреНрддрд┐рд╢рд╛рд▓реА IObservable<IChangeSet<Trade>> рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдорджрдж рд╕реЗ, рд╣рдо рдЕрдкрдиреЗ рджреГрд╢реНрдп рдореЙрдбрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд IObservable<IChangeSet<Trade>> рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред


 public class TradesViewModel : ReactiveObject { private readonly ReadOnlyObservableCollection<TradeVm> _trades; public ReadOnlyObservableCollection<TradeVm> Trades => _trades; public TradesViewModel(IBackgroundService background) { // Connect to the data source, transform elements, bind // them to the read-only observable collection. background.Connect() .Transform(x => new TradeVm(x)) .ObserveOn(RxApp.MainThreadScheduler) .Bind(out _trades) .DisposeMany() .Subscribe(); } } 

Transform , Filter рдФрд░ Sort рдСрдкрд░реЗрдЯрд░реНрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбрд╛рдпрдиреЗрдорд┐рдХрдбрд╛рдЯрд╛ рдЧреНрд░реБрдкрд┐рдВрдЧ, рд▓реЙрдЬрд┐рдХрд▓ рдСрдкрд░реЗрд╢рдВрд╕, рдХрд▓реЗрдХреНрд╢рди рдлреНрд▓реИрдЯрд┐рдВрдЧ, рдПрдЧреНрд░реЗрд╕рд┐рд╡ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ, рд╕рдорд░реВрдк рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдХреЗ рдПрд▓рд┐рдорд┐рдиреЗрд╢рди, рдПрд▓рд┐рдореЗрдВрдЯ рдХрд╛рдЙрдВрдЯрд┐рдВрдЧ рдФрд░ рд╡реНрдпреВ рдореЙрдбрд▓ рд▓реЗрд╡рд▓ рдкрд░ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рднреА рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред рдЖрдк GitHub рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА README рдореЗрдВ рд╕рднреА рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред




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


 // Declare the derived collection. ReadOnlyObservableCollection<TradeVm> _derived; // Declare and initialize the source collection. var source = new ObservableCollectionExtended<Trade>(); source.ToObservableChangeSet(trade => trade.Key) .Transform(trade => new TradeProxy(trade)) .Filter(proxy => proxy.IsChecked) .Bind(out _derived) .Subscribe(); 

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


 // IObservable<bool> var isValid = databases .ToObservableChangeSet() // Subscribe only to IsValid property changes. .AutoRefresh(database => database.IsValid) // Materialize the collection. .ToCollection() // Determine if all forms are valid. .Select(x => x.All(y => y.IsValid)); // If ReactiveUI is used, you can transform the // IObservable<bool> variable to a property declared // as ObservableAsPropertyHelper<bool>, eg IsValid. _isValid = isValid .ObserveOn(RxApp.MainThreadScheduler) .ToProperty(this, x => x.IsValid); 

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





рдирд┐рд╖реНрдХрд░реНрд╖


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 рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреГрд╖реНрда рдкрд░ рдбрд╛рдпрдирд╛рдореИрдбрд╛рдЯрд╛ рдХрд╛ рдЕрдзреНрдпрдпрди рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбрд╛рдпрдиреЗрдорд╛рдбрд╛рдЯрд╛ рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рднреА рдзреНрдпрд╛рди рд░рдЦреЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреА рдЬрд░реВрд░рдд рдХреА рд▓рдЧрднрдЧ рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдирдореВрдиреЗ рд╣реЛрдВред

Source: https://habr.com/ru/post/hi454074/


All Articles