ListBoxのDataSourceバインドについて


はじめに

C#のフォームにて、ListBoxのDataSourceに対して、
ReactiveProperty や ReactiveCollectionを使ってデータバインドを試みた。
しかし、初期値は反映されるけど、コレクションの操作はViewに反映されなくて困った。

ReactivePropertyについてはこちら。

PropertyChangedを使って反映

DataSourceに関して、ReactivePropertyを使わず、変更通知は自前でやる事にした。

  1. ViewModelクラスにListBoxのDataSource用プロパティを定義する

    ViewModel
    class HogeViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        public List<string> ListDataSource { get; } = new List<string>() { "初期", "データ" };
    
        ...
    }
    
  2. Formのデザインビューから、ListBoxのDataSourceを、先程定義した ListDataSource を選択する

  3. 各コレクションの操作用メソッドを実装する

    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>() { "初期", "データ" };