2017-07-07 11 views
0

ObservableCollection CustomerListをDataGridにバインドします。最初に開いたときに正常に機能しますが、buttionを使用してfactionを呼び出してCustomerListに新しいオブジェクトを渡します元のCustomerListがアップアップされていないので、これがデータグリッドアップデートの仕組みであることを認識しています。この場合、問題を解決するにはどうすればよいですか?私は 新しいデータソースの再バインド時にDataGridが更新されない

class CustomerViewModel 
{ 
    public ObservableCollection<Customer> CustomerList { get; set; }   

    public RelayCommand SearchCommand { get; set; } 
    public CustomerViewModel() 
    { 
     CustomerList = new ObservableCollection<Customer>(customerDAL.GetAllCustomers()); 
     SearchCommand = new RelayCommand(SearchCustomersByKeyWords); 
    } 

    void SearchCustomersByKeyWords(object parameter) 
    {    

     CustomerList = new ObservableCollection<Customer>(customerDAL.SearchByKeywords(keyWords)); 

    } 
} 
+0

ObservableCollectionからアイテムを追加/削除し、再初期化しないでください。 UIは元のインスタンスに接続されています。 –

+0

@GlennFerrie、そうです、問題は現在のデザインのために新しいコレクションが必要なのですが、とにかく新しいコレクションに接続するためにDataGridを入手できますか? –

答えて

3

CustomerViewModelが実際のviewmodelないMVVMパターンを使用しています。それは普通のクラスです。適切なビューモデルになるには、implement INotifyPropertyChangedが必要です。

CustomerListの値を変更する場合、PropertyChangedイベントをINotifyPropertyChangedにする必要があります。そうでなければ、UIはCustomerListの値が変更されたことを決して知らないでしょう。 DataGrid.ItemsSourceのバインディングは、ソースプロパティを更新したことを知らないため、ターゲットプロパティを更新していません。

CustomerListは次のようになります。

public class CustomerViewModel : ViewModelBase 
{ 
    private ObservableCollection<Customer> _customerList = new ObservableCollection<Customer>(); 
    public ObservableCollection<Customer> CustomerList { 
     get { return _customerList; } 
     set { 
      if (_customerList != value) { 
       _customerList != value; 
       // Member of ViewModelBase that raises PropertyChanged 
       OnPropertyChanged(nameof(CustomerList)); 
      } 
     } 
    } 

をそしてINotifyPropertyChangedを実装ViewModelBaseクラスを記述します。あなたはそのオンラインの多くの例を見つけるでしょう。

あなたが持っているコレクションを保持することですが、Clear()それを回避し、新しいアイテムを1つ1つループに追加することです。

+0

私はあなたの提案を取った、それは今すぐうまく動作します、ありがとう! –

関連する問題