我将 ObservableCollection CustomerList 绑定(bind)到数据网格,最初打开时它工作正常,但是当我使用按钮调用函数以向 CustomerList 提供新对象时,数据网格不会刷新,我知道这是如何数据网格更新有效,因为原始 CustomerList 没有更新,那么在这种情况下我该怎么做才能解决问题?我正在使用 MVVM 模式
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));
}
}
最佳答案
CustomerViewModel
实际上不是 View 模型。这只是一堂普通的课。要成为正确的 View 模型,它需要 implement INotifyPropertyChanged
.
当您更改 CustomerList
的值时,你必须提出 PropertyChanged
INotifyPropertyChanged
的事件.否则,UI 永远不会知道 CustomerList
的值。已经改变。 DataGrid.ItemsSource
上的绑定(bind)不知道您更新了源属性,因此它没有更新目标属性。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()
它并在循环中将新项目一一添加到其中。
关于c# - 重新绑定(bind)新数据源时 DataGrid 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44973983/