2019幎2æãMicrosoft .NETãã©ãããã©ãŒã ã§GUIã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®ã¯ãã¹ãã©ãããã©ãŒã ãã¬ãŒã ã¯ãŒã¯ã§ãã
ReactiveUI 9ããªãªãŒã¹ãããŸããã
ReactiveUIã¯ã
ãªã¢ã¯ãã£ããšã¯ã¹ãã³ã·ã§ã³ãMVVMãã¶ã€ã³ãã¿ãŒã³ãšå¯æ¥ã«çµ±åããããã®ããŒã«ã§ãã ãã¬ãŒã ã¯ãŒã¯ã®
ç¥è ã¯ã Habréã®äžé£ã®èšäºãŸãã¯
ããã¥ã¡ã³ãã®ããã³ãããŒãžããå§ããããšãã§ã
ãŸã ã ReactiveUI 9ã¢ããããŒãã«ã¯å€ãã®
ä¿®æ£ãšæ¹åãå«ãŸããŠããŸãããããããæãè峿·±ãéèŠãªå€æŽç¹ã¯
DynamicDataãã¬ãŒã ã¯ãŒã¯ãšã®ç·å¯ãªçµ±åã§ãã ãããã«ãããªã¢ã¯ãã£ãã¹ã¿ã€ã«ã§ã³ã¬ã¯ã·ã§ã³ã®å€æŽãæäœã§ã
ãŸã ã ã©ã®ãããªå Žåã«
DynamicDataã
圹ç«ã€ãããã®åŒ·åãªãªã¢ã¯ãã£ããã¬ãŒã ã¯ãŒã¯ãã©ã®ããã«å
éšã«é
眮ãããŠããããææ¡ããŠã¿ãŸãããã
èæ¯
æåã«ã
DynamicDataã解決ããã¿ã¹ã¯ã®ç¯å²ãå®çŸ©ãã
System.Collections.ObjectModel
åå空éããã®ããŒã¿ã»ããã®å€æŽãåŠçããããã®æšæºããŒã«ãç§ãã¡ã«åããªãçç±ãèŠã€ã
ãŸã ã
ãåãã®ãšãããMVVMãã³ãã¬ãŒãã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¢ãã«ããã¬ãŒã³ããŒã·ã§ã³ãããã³ãã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®ã¬ã€ã€ãŒéã®è²¬ä»»ã®åå²ãå«ãŸããŸãã ã¢ãã«å±€ã¯ãã¡ã€ã³ãšã³ãã£ãã£ãšãµãŒãã¹ã«ãã£ãŠè¡šããããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã«ã€ããŠã¯äœãç¥ããŸããã ã¢ãã«ã¬ã€ã€ãŒã¯è€éãªã¢ããªã±ãŒã·ã§ã³ããžãã¯å
šäœãã«ãã»ã«åãããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã¯ã¢ãã«ã®æäœãå§ä»»ãã芳å¯å¯èœãªããããã£ãã³ãã³ããã³ã¬ã¯ã·ã§ã³ãéããŠã¢ããªã±ãŒã·ã§ã³ã®çŸåšã®ç¶æ
ã«é¢ããæ
å ±ãžã®ãã¥ãŒã¢ã¯ã»ã¹ãèš±å¯ããŸãã ããããã£ã®å€æŽãåŠçããæšæºããŒã«ã¯ã
INotifyPropertyChanged
ã€ã³ã¿ãŒãã§ã€ã¹ããŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãåŠçãã
INotifyPropertyChanged
ãããã³
INotifyCollectionChanged
å®è£
ãã
ObservableCollection
ãš
ReadOnlyObservableCollection
ãå®è£
ãã
INotifyCollectionChanged
ã

INotifyPropertyChanged
ãš
ICommand
ã®å®è£
ã¯ãéåžžãéçºè
ãšäœ¿çšãããMVVMãã¬ãŒã ã¯ãŒã¯ã®è¯å¿ã«æ®ããŸããã
ObservableCollection
ã®äœ¿çšã«ã¯å€ãã®å¶éã課ããããŸãïŒ ããšãã°ã
Dispatcher.Invoke
ãŸãã¯åæ§ã®åŒã³åºããè¡ããã«ããã¯ã°ã©ãŠã³ãã¹ã¬ããããã³ã¬ã¯ã·ã§ã³ã倿Žããããšã¯ã§ããŸãããããã¯ãããã¯ã°ã©ãŠã³ãæäœããµãŒããŒãšåæããããŒã¿é
åãæäœããå Žåã«åœ¹ç«ã¡ãŸãã æ
£çšçãªMVVMã§ã¯ãã¢ãã«å±€ã¯äœ¿çšãããGUIã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£ãç¥ãå¿
èŠããªããMVCãŸãã¯MVPããã®ã¢ãã«ãšäºææ§ãããå¿
èŠãããããããå€ãã®
Dispatcher.Invoke
ãå®è¡äžã®ããã¯ã°ã©ãŠã³ãã¹ã¬ãããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã³ã³ãããŒã«ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããçç±ã§ãããã¡ã€ã³ãµãŒãã¹ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã¬ã€ã€ãŒéã§è²¬ä»»ãå
±æãããšããååã«éåããŸãã
ãã¡ããããã¡ã€ã³ãµãŒãã¹ã§ã¯ãã€ãã³ãã宣èšãã倿ŽãããããŒã¿ãã€ãã³ãã®åŒæ°ãšããŠãã£ã³ã¯ã転éã§ããŸãã æ¬¡ã«ãã€ãã³ãã«ãµãã¹ã¯ã©ã€ããã䜿çšããGUIãã¬ãŒã ã¯ãŒã¯ã«äŸåããªãããã«
Dispatcher.Invoke
åŒã³åºããã€ã³ã¿ãŒãã§ã€ã¹ã§ã©ããããå¿
èŠã«å¿ããŠ
Dispatcher.Invoke
ããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã«ç§»åãã
ObservableCollection
倿Ž
ObservableCollection
ãŸãã ã å匷ãå§ããŸãããïŒ
ãªã¢ã¯ãã£ãæ¡åŒµã ããŒã¿ã¹ããªãŒã ã管çãã
DynamicDataã«ãã£ãŠå°å
¥ãããæœè±¡åãšããªã¢ã¯ãã£ããªããŒã¿ã»ããã®å€æŽã«é¢ããååãå®å
šã«çè§£ããããã«ã
ãªã¢ã¯ãã£ããªããã°ã©ãã³ã°ãšã¯äœããMicrosoft .NETãã©ãããã©ãŒã ãšMVVMãã¶ã€ã³ãã¿ãŒã³ã®ã³ã³ããã¹ãã§ãããé©çšããæ¹æ³ãæãåºã
ãŠã¿ãŸãããã ããã°ã©ã ã³ã³ããŒãã³ãéã®å¯Ÿè©±ãæŽçããæ¹æ³ã¯ã察話åã§åå¿åã«ããããšãã§ããŸãã ã€ã³ã¿ã©ã¯ãã£ããªçžäºäœçšã§ã¯ãã³ã³ã·ã¥ãŒããŒé¢æ°ã¯ãããã€ããŒé¢æ°ããããŒã¿ãåæçã«åãåãïŒ
IEnumerable
ã¢ãããŒãã
T
ã
IEnumerable
ïŒããªã¢ã¯ãã£ããªçžäºäœçšã§ã¯ãã³ã³ã·ã¥ãŒããŒé¢æ°ã¯éåæçã«ããŒã¿ãã³ã³ã·ã¥ãŒããŒé¢æ°ã«é
ä¿¡ããŸãïŒããã·ã¥ããŒã¹ã®ã¢ãããŒãã
Task
ã
IObservable
ïŒã
ãªã¢ã¯ãã£ãããã°ã©ãã³ã°ã¯ãéåæããŒã¿ã¹ããªãŒã ã䜿çšããããã°ã©ãã³ã°ã§ããããªã¢ã¯ãã£ããšã¯ã¹ãã³ã·ã§ã³ã¯ãSystemåå空éã®
IObservable
ããã³
IObserver
ã«åºã¥ãå®è£
ã®ç¹å¥ãªã±ãŒã¹ã§ããããã¯ãLINQ over ObservableãšåŒã°ãã
IObservable
ã€ã³ã¿ãŒãã§ã€ã¹ã§ã®LINQã«äŒŒãæäœã®æ°ãå®çŸ©ããŸãã ãªã¢ã¯ãã£ãæ¡åŒµæ©èœã¯.NET StandardããµããŒãããMicrosoft .NETãã©ãããã©ãŒã ãæ©èœããå Žæã§ããã°ã©ãã§ãæ©èœããŸãã

ReactiveUIãã¬ãŒã ã¯ãŒã¯ã¯ãã¢ããªã±ãŒã·ã§ã³éçºè
ã
ICommand
ããã³
INotifyPropertyChanged
ãªã¢ã¯ãã£ãå®è£
ãå©çšããããã«æåŸ
ãã
ReactiveCommand<TIn, TOut>
ããã³
WhenAnyValue
ãªã©ã®åŒ·åãªããŒã«ãæäŸããŸãã
WhenAnyValue
䜿çš
WhenAnyValue
ãšãINotifyPropertyChangedãå®è£
ããã¯ã©ã¹ã®ããããã£ã
IObservable<T>
åã®ã€ãã³ãã¹ããªãŒã ã«å€æã§ã
WhenAnyValue
ãããã«ãããäŸåããããã£ã®å®è£
ãç°¡åã«ãªããŸãã
public class ExampleViewModel : ReactiveObject { [Reactive]
ReactiveCommand<TIn, TOut>
ã§ã¯ãã¿ã€ã
IObservable<TOut>
ã€ãã³ãã®ããã«ã³ãã³ãã
ReactiveCommand<TIn, TOut>
ã§ããŸããããã¯ãã³ãã³ãã®å®è¡ãå®äºãããã³ã«çºè¡ãããŸãã ãŸãããã¹ãŠã®ã³ãã³ãã«ã¯ãã¿ã€ã
IObservable<Exception>
ThrownExceptions
ããããã£ããã
IObservable<Exception>
ã
ä»åã¯ãç£èŠå¯Ÿè±¡ã®ãªããžã§ã¯ãã®ç¶æ
ãå€åãããã³ã«ã¿ã€ã
T
æ°ããå€ãçºè¡ããã€ãã³ãã®ããã«ã
IObservable<T>
ã䜿çšããŸããã ç°¡åã«èšãã°ã
IObservable<T>
ã¯ã€ãã³ãã®ã¹ããªãŒã ã§ãããæéã®çµéãšãšãã«åŒã䌞ã°ãããã·ãŒã±ã³ã¹ã§ãã
ãã¡ãããã³ã¬ã¯ã·ã§ã³ãç°¡åãã€èªç¶ã«æäœã§ããŸããã³ã¬ã¯ã·ã§ã³ã倿Žããããã³ã«ã倿ŽãããèŠçŽ ãå«ãæ°ããã³ã¬ã¯ã·ã§ã³ãå
¬éããŸãã ãã®å Žåãå
¬éãããå€ã¯
IEnumerable<T>
åãŸãã¯ããç¹æ®åããããã®ã«ãªããã€ãã³ãèªäœã¯
IObservable<IEnumerable<T>>
åã«
IObservable<IEnumerable<T>>
ã ããããæ¹å€çã«èããŠããèªè
ãæ£ããææããŠããããã«ãããã¯ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«æ·±å»ãªåé¡ãæ±ããŠããŸããç¹ã«ã³ã¬ã¯ã·ã§ã³ã«12åã®èŠçŽ ããªãã100åããŸãã¯æ°ååã®èŠçŽ ãããå Žåã§ãã
DynamicDataã®æŠèŠ
DynamicDataã¯ãã³ã¬ã¯ã·ã§ã³ãæäœãããšãã«ãªã¢ã¯ãã£ããšã¯ã¹ãã³ã·ã§ã³ã®ãã¹ãŠã®æ©èœã䜿çšã§ããããã«ããã©ã€ãã©ãªã§ãã ããã«äœ¿ãããªã¢ã¯ãã£ãæ¡åŒµã¯ãããŒã¿ã»ããã®å€æŽã«å¯Ÿå¿ããæé©ãªæ¹æ³ãæäŸããŸãã
ãDynamicDataã®ä»äºã¯ãããä¿®æ£ããããšã§ãã ã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã³ã¬ã¯ã·ã§ã³ãåçã«æŽæ°ããå¿
èŠããããŸããéåžžãã³ã¬ã¯ã·ã§ã³ã¯ã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«ããã€ãã®èŠçŽ ã§æºãããããã®åŸéåæã«æŽæ°ãããŠããµãŒããŒãŸãã¯ããŒã¿ããŒã¹ãšæ
å ±ãåæããŸãã ææ°ã®ã¢ããªã±ãŒã·ã§ã³ã¯éåžžã«è€éã§ãããã³ã¬ã¯ã·ã§ã³ã®æåœ±ãäœæããå¿
èŠããããŸã-èŠçŽ ã®ãã£ã«ã¿ãŒã倿ããŸãã¯äžŠã¹æ¿ãã DynamicDataã¯ãåçã«å€åããããŒã¿ã»ããã管çããããã«å¿
èŠãªéåžžã«è€éãªã³ãŒããåãé€ãããã«èšèšãããŸããã ãã®ããŒã«ã¯ç©æ¥µçã«éçºããã³å®æãããçŸåšãã³ã¬ã¯ã·ã§ã³ãæäœããããã®60以äžã®ãªãã¬ãŒã¿ãŒããµããŒããããŠããŸãã
DynamicDataã¯
ObservableCollection<T>
代æ¿å®è£
ã§ã¯ãããŸããã
DynamicDataã¢ãŒããã¯ãã£
ã¯ãäž»ã«ãã¡ã€ã³åºæã®ããã°ã©ãã³ã°ã®æŠå¿µã«åºã¥ããŠããŸãã 䜿çšã®ã€ããªãã®ãŒã¯ãããŒã¿ãœãŒã¹ãã€ãŸãããŒã¿ã®åæãšå€æŽãæ
åœããã³ãŒããã¢ã¯ã»ã¹ã§ããã³ã¬ã¯ã·ã§ã³ã管çãããšããäºå®ã«åºã¥ããŠããŸãã æ¬¡ã«ããœãŒã¹ã«ããã€ãã®æŒç®åãé©çšããŸããããã«ãããä»ã®ã³ã¬ã¯ã·ã§ã³ãæåã§äœæããã³å€æŽããããšãªãã宣èšçã«ããŒã¿ã倿ã§ããŸãã å®éã
DynamicDataã§ã¯èªã¿åãæäœãšæžãèŸŒã¿æäœãåé¢ãããªã¢ã¯ãã£ããªæ¹æ³ã§ã®ã¿èªã¿åããå¯èœã§ãããããã£ãŠãç¶æ¿ãããã³ã¬ã¯ã·ã§ã³ã¯åžžã«ãœãŒã¹ãšåæãããŸãã
DynamicDataã¯ãåŸæ¥ã®
IObservable<T>
代ããã«ã
IObservable<IChangeSet<T>>>
ããã³
IObservable<IChangeSet<TValue, TKey>>
æäœãå®çŸ©ããŸã
IChangeSet
ã¯ãã³ã¬ã¯ã·ã§ã³ã®å€æŽïŒå€æŽã®çš®é¡ãšåœ±é¿ãåããèŠçŽ ïŒã«é¢ããæ
å ±ãå«ããã£ã³ã¯ã§ãã ãã®ã¢ãããŒãã«ããããªã¢ã¯ãã£ãã¹ã¿ã€ã«ã§èšè¿°ãããã³ã¬ã¯ã·ã§ã³ãæäœããããã®ã³ãŒãã®ããã©ãŒãã³ã¹ã倧å¹
ã«åäžããŸãã åæã«ãã³ã¬ã¯ã·ã§ã³ã®ãã¹ãŠã®èŠçŽ ãäžåºŠã«åŠçããå¿
èŠãçããå Žåã
IObservable<IChangeSet<T>>
ã¯åžžã«éåžžã®
IObservable<IEnumerable<T>>
倿ã§ããŸãã ãããè€éã«èãããå Žå-å¿é
ããªãã§ãã³ãŒãäŸãããã¹ãŠãæç¢ºã§éæã«ãªããŸãïŒ
DynamicDataã®äŸ
äžé£ã®äŸãèŠãŠãDynamicDataã®ä»çµã¿ã
System.Reactive
ãšã®éããGUIã䜿çšããã¢ããªã±ãŒã·ã§ã³ãœãããŠã§ã¢ã®éåžžã®éçºè
ã解決ã§ããã¿ã¹ã¯ãçè§£ããããã«ãããèŠãŠã¿ãŸãããã
GitHubã«DynamicDataãæçš¿ããå
æ¬çãªäŸããå§ããŸãããã ãã®äŸã§ã¯ãããŒã¿ãœãŒã¹ã¯
SourceCache<Trade, long>
ããã©ã³ã¶ã¯ã·ã§ã³ã®ã³ã¬ã¯ã·ã§ã³ãå«ãŸããŠããŸãã ã¿ã¹ã¯ã¯ãã¢ã¯ãã£ããªãã©ã³ã¶ã¯ã·ã§ã³ã®ã¿ã衚瀺ããã¢ãã«ããããã·ãªããžã§ã¯ãã«å€æããã³ã¬ã¯ã·ã§ã³ããœãŒãããããšã§ãã
äžèšã®äŸã§ã¯ãããŒã¿ãœãŒã¹ã§ãã
SourceCache
ã倿Žãã
SourceCache
ãããã«å¿ããŠ
ReadOnlyObservableCollection
ã倿ŽãããŸãã ãã®å Žåãã³ã¬ã¯ã·ã§ã³ããèŠçŽ ãåé€ãããšã
Dispose
ã¡ãœãããåŒã³åºãããã³ã¬ã¯ã·ã§ã³ã¯åžžã«GUIã¹ããªãŒã ã§ã®ã¿æŽæ°ããããœãŒãããã³ãã£ã«ã¿ãŒããããŸãŸã«ãªããŸãã ã¯ãŒã«ã§ã
Dispatcher.Invoke
ãšè€éãªã³ãŒãã¯ãããŸããïŒ
SourceListããã³SourceCacheããŒã¿ãœãŒã¹
DynamicDataã¯ãå¯å€ããŒã¿ãœãŒã¹ãšããŠäœ¿çšã§ãã2ã€ã®ç¹å¥ãªã³ã¬ã¯ã·ã§ã³ãæäŸã
ãŸã ã ãããã®ã³ã¬ã¯ã·ã§ã³ã®ã¿ã€ãã¯
SourceList
ããã³
SourceCache<TObject, TKey>
ã§ãã
TObject
ã«äžæã®ããŒãããå Žåã¯åžžã«
SourceCache
ã䜿çšããããšããå§ãããŸãããã以å€ã®å Žåã¯
SourceList
䜿çšã
SourceList
ã ãããã®ãªããžã§ã¯ãã¯ã
Add
ã
Remove
ã
Insert
ãããŒã¿ã倿Žããããã®äœ¿ãæ
£ãã.NETéçºè
APIãæäŸããŸãã ããŒã¿ãœãŒã¹ã
IObservable<IChangeSet<T>>
ãŸãã¯
IObservable<IChangeSet<T, TKey>>
ã«
.Connect()
ããã«ã¯ã
.Connect()
æŒç®åã䜿çšããŸãã ããšãã°ãããã¯ã°ã©ãŠã³ãã§èŠçŽ ã®ã³ã¬ã¯ã·ã§ã³ãæŽæ°ãããµãŒãã¹ãããå Žåã
Dispatcher.Invoke
ãã¢ãŒããã¯ãã£ã®éå°ã䜿çšããã«ããããã®èŠçŽ ã®ãªã¹ããGUIãšç°¡åã«åæã§ããŸãã
public class BackgroundService : IBackgroundService {
DynamicDataã¯ãçµã¿èŸŒã¿ã®.NETã¿ã€ãã䜿çšããŠãããŒã¿ãå€éšã«ãããããŸãã 匷åãªDynamicDataæŒç®åã䜿çšããŠã
IObservable<IChangeSet<Trade>>
ããã¥ãŒã¢ãã«ã®
ReadOnlyObservableCollection
倿ã§ããŸãã
public class TradesViewModel : ReactiveObject { private readonly ReadOnlyObservableCollection<TradeVm> _trades; public ReadOnlyObservableCollection<TradeVm> Trades => _trades; public TradesViewModel(IBackgroundService background) {
Transform
ã
Filter
ã
Sort
ã«å ããŠãDynamicDataã«ã¯ä»ã®å€ãã®æŒç®åãå«ãŸããŠãããã°ã«ãŒãåãè«çæŒç®ãã³ã¬ã¯ã·ã§ã³ã®å¹³æ»åãéçŽé¢æ°ã®äœ¿çšãåäžèŠçŽ ã®é€å€ãèŠçŽ ã®ã«ãŠã³ãããã¬ãŒã³ããŒã·ã§ã³ã¢ãã«ã®ã¬ãã«ã§ã®ä»®æ³åãŸã§ããµããŒãããŠããŸãã
GitHubã®READMEãããžã§ã¯ãã«ãããã¹ãŠã®ãªãã¬ãŒã¿ãŒã®è©³çްãèªãã§ãã ããã

ã·ã³ã°ã«ã¹ã¬ããã³ã¬ã¯ã·ã§ã³ãšå€æŽè¿œè·¡
SourceList
ãš
SourceCache
å ããŠãDynamicDataã©ã€ãã©ãªã«ã¯ã倿Žå¯èœãªã³ã¬ã¯ã·ã§ã³ã®åäžã¹ã¬ããå®è£
ã§ãã
ObservableCollectionExtended
ãå«ãŸããŠããŸãã ãã¥ãŒã¢ãã«ã®2ã€ã®ã³ã¬ã¯ã·ã§ã³ãåæããã«ã¯ã1ã€ã
ObservableCollectionExtended
ãšããŠå®£èšãããã1ã€ã
ReadOnlyObservableCollection
ãšããŠå®£èšãã
ToObservableChangeSet
æŒç®åã䜿çšã
Connect
ããã¯
Connect
ãšåãããã«åäœã
Connect
ã
ObservableCollection
ãšé£æºããããã«èšèšãããŠããŸã
DynamicDataã¯ã
INotifyPropertyChanged
ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããã¯ã©ã¹ã®å€æŽã®è¿œè·¡ããµããŒãããŠããŸãã ããšãã°ãã¢ã€ãã ã®ããããã£ã倿Žããããã³ã«ã³ã¬ã¯ã·ã§ã³ã®å€æŽãéç¥ããå Žåã¯ã
AutoRefresh
ã䜿çšããŠãç®çã®ããããã£ã®ã»ã¬ã¯ã¿ãŒãåŒæ°ã§æž¡ããŸãã
AutoRefesh
ããã³ãã®ä»ã®DynamicDataæŒç®åã䜿çšãããšãç»é¢ã«è¡šç€ºãããèšå€§ãªæ°ã®ãã©ãŒã ããã³ãµããã©ãŒã ãç°¡åãã€èªç¶ã«æ€èšŒã§ããŸãã
DynamicDataæ©èœã«åºã¥ããŠãããªãè€éãªã€ã³ã¿ãŒãã§ã€ã¹ããã°ããäœæã§ããŸããããã¯ã倧éã®ãªã¢ã«ã¿ã€ã ããŒã¿ã衚瀺ããã·ã¹ãã ãã€ã³ã¹ã¿ã³ãã¡ãã»ãŒãžã³ã°ã·ã¹ãã ãããã³ç£èŠã·ã¹ãã ã«ç¹ã«åœãŠã¯ãŸããŸãã

ãããã«
ãªã¢ã¯ãã£ããšã¯ã¹ãã³ã·ã§ã³ã¯ãããŒã¿ãšãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã宣èšçã«æäœããç§»æ€å¯èœãªãµããŒããããŠããã³ãŒããèšè¿°ããè€éãªåé¡ãã·ã³ãã«ãã€ãšã¬ã¬ã³ããªæ¹æ³ã§è§£æ±ºã§ãã匷åãªããŒã«ã§ãã
ReactiveUIã䜿çšãããšã.NETéçºè
ã¯
INotifyPropertyChanged
ããã³
ICommand
ãªã¢ã¯ãã£ããªå®è£
ãæäŸããããšã«ãããMVVMã¢ãŒããã¯ãã£ã䜿çšããŠãããžã§ã¯ãã«
ãªã¢ã¯ãã£ããªæ¡åŒµæ©èœãç·å¯ã«çµ±åã§ããŸãã
ReactiveUIããã³
DynamicDataã©ã€ãã©ãªã¯ ãWindows Presentation FoundationãUniversal Windows Platformã
Avalonia ãXamarin.AndroidãXamarin FormsãXamarin.iOSãªã©ãæãäžè¬çãª.NET Framework GUIãã¬ãŒã ã¯ãŒã¯ãšäºæ
æ§ããã
ãŸã ã
察å¿ããReactiveUIããã¥ã¡ã³ãããŒãžããDynamicDataã®åŠç¿ãéå§ã§ã
ãŸã ã ãŸãã
DynamicData Snippetsãããžã§ã¯ããå¿
ããã§ãã¯ããŠãã ããããã®ãããžã§ã¯ãã«ã¯ãããããå Žé¢ã§DynamicDataã䜿çšããäŸãå«ãŸããŠããŸãã