はじめに
C#のフォームにて、ListBoxのDataSourceに対して、
ReactiveProperty や ReactiveCollectionを使ってデータバインドを試みた。
しかし、初期値は反映されるけど、コレクションの操作はViewに反映されなくて困った。
PropertyChangedを使って反映
DataSourceに関して、ReactivePropertyを使わず、変更通知は自前でやる事にした。
-
ViewModelクラスにListBoxのDataSource用プロパティを定義する
ViewModelclass HogeViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public List<string> ListDataSource { get; } = new List<string>() { "初期", "データ" }; ... }
-
Formのデザインビューから、ListBoxのDataSourceを、先程定義した ListDataSource を選択する
-
各コレクションの操作用メソッドを実装する
private void AddListItem() { ListDataSource.Add("hoge"); PropertyChanged(ListDataSource, new PropertyChangedEventArgs(nameof(ListDataSource))); } private void ClearListItem() { ListDataSource.Clear(); PropertyChanged(ListDataSource, new PropertyChangedEventArgs(nameof(ListDataSource))); }
上記の手順で要求を満たせたので、メモとして残しておく。
※追記 2018/03/30
BindingList を使えば、PropertyChanged を利用しなくても通知が行えた。
変更箇所
public List<string> ListDataSource { get; } = new List<string>() { "初期", "データ" };
↓
public BindingList <string> ListDataSource { get; } = new BindingList <string>() { "初期", "データ" };