LoginSignup
2
4

More than 5 years have passed since last update.

ListBoxのDataSourceバインドについて

Last updated at Posted at 2018-03-29

はじめに

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

2
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4