触发查询时数据网格不更新

Datagrid not updating when query is fired

所以我的 UserControl 中有一个 DataGrid。它数据绑定到 My ViewModel 中的 observable collection。 ViewModel 实现 INotifyPropertyChanged 接口并已在视图中适当连接。

在我看来:

<DataGrid AutoGenerateColumns="False"
          EnableRowVirtualization="True"
          ItemsSource="{Binding ContributionCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">

<!-- DataGrid rows -->

/>

在 ViewModel 中:

    private ObservableCollection<contribution> _contributionCollection;
    public ObservableCollection<contribution> ContributionCollection
    {
        get
        {
            return _contributionCollection;
        }
        set
        {
            _contributionCollection= value;
            OnPropertyChanged("ContributionCollection");
        }
    }

这意味着什么;单击特定按钮,将触发对数据库的查询并返回一些结果。这些结果将显示在 Datagrid 中。

    // Fired by an ICommand Property
    public object Contributions_CommandExecute(object param)                                           
    {
        var queryContributions = context.contributions.Where(c => c.member == Member);
        return _contributionCollection = new ObservableCollection<contribution>(queryContributions);
    }

但是数据网格总是空的。应用程序冻结了一点,表明后台发生了一些事情,但实际上没有在视图上传达任何信息。事实上,它唯一能正常工作的情况是 ViewModel 构造函数在初始化时触发查询。但是之后就不会再火了

知道我哪里出错了吗?

这一行

return _contributionCollection = new ObservableCollection<contribution>(queryContributions);

仅更新​​字段值。因为它不使用 属性 setter,所以 OnPropertyChanged("ContributionCollection"); 没有被调用

解决方案是使用 属性(顺便说一下,为什么方法不是 void?)

// Fired by an ICommand Property
public void Contributions_CommandExecute(object param)
{
    var queryContributions = context.contributions.Where(c => c.member == Member);
    ContributionCollection = new ObservableCollection<contribution>(queryContributions);
}

您必须使用 Dispatcher 更新列表,这样您就不会像这样中断 GUI:

Dispatcher.BeginInvoke(new Action(() => _contributionCollection = new ObservableCollection<contribution>(queryContributions)));

我遇到了类似的问题:

查看

<DataGrid AutoGenerateColumns="False"
          EnableRowVirtualization="True"
          ItemsSource="{Binding ContributionCollection}">

<!-- DataGrid rows -->

/>

视图模型

public void Contributions_CommandExecute(object param)                                           
    {
        ContributionCollection = new ObservableCollection<contribution>(context.contributions.Where(c => c.member == Member));
    }