c# - 重新绑定(bind)新数据源时 DataGrid 不更新

标签 c# wpf mvvm datagrid

我将 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/

相关文章:

java - 从 Web 服务检索数据后 Android 数据绑定(bind)不更新 UI

windows-phone-7 - 如何在 Windows Phone 中使用 Caliburn.Micro 创建 View 和 View 模型

c# - AppFabric CreateRoutingClient 错误

C#: "using"实例化表单时?

wpf - 在 try catch c# 中处理 AccessViolation 异常

c# - 动态加载 ResourceDictionary

c# - ASP.NET 全局化——显示日期

c# - GUI何时过载?

c# - 如何设置 ViewBox 背景?

c# - 按搜索字符串过滤 CollectionViewSource - 绑定(bind)到 itemscontrol (WPF MVVM)