触发查询时Datagrid不会更新

时间:2016-04-19 07:11:09

标签: c# wpf datagrid observablecollection

所以我DataGrid中有一个UserControl。它是数据绑定到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构造函数在初始化时触发查询。但在那之后,它又不会再开火了。

知道我哪里出错了吗?

3 个答案:

答案 0 :(得分:1)

这一行

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

仅更新字段值。由于它没有使用属性设置器,因此不会调用OnPropertyChanged("ContributionCollection");

解决方案是使用属性(顺便说一句,为什么方法不是无效的?)

// 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);
}

答案 1 :(得分:1)

查看

<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));
    }

答案 2 :(得分:0)

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

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

我遇到了类似的问题:

Update Observable Collection