2017-07-07 91 views
0

我將ObservableCollection CustomerList綁定到數據網格,它在最初打開時工作正常,但是當我使用Buttion調用功能以將新對象提供給CustomerList時DataGrid不是刷新,我知道這是數據網格更新如何工作的方式,因爲原來的CustomerList沒有上傳,所以在這種情況下我能做些什麼來解決這個問題?我使用MVVM模式 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中的項目,不要重新初始化它。用戶界面連接到原始實例。 –

+0

@GlennFerrie,是的,你是對的,問題是我需要一個新的集合,由於目前的設計,有無論如何我可以得到datagrid連接到新的集合? –

回答

3

CustomerViewModel實際上不是一個視圖模型。這只是一個普通班。要成爲一個適當的視圖模型,它需要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)); 
      } 
     } 
    } 

,寫一個ViewModelBase類實現INotifyPropertyChanged;你會發現很多在線的例子。

一個糟糕的解決方法是保持你的收藏,但Clear()它並在一個循環中逐個添加新項目。

+0

我接受了你的建議,現在工作正常,謝謝! –