【问题标题】:Datagrid not updating when query is fired触发查询时数据网格不更新
【发布时间】:2016-04-19 07:11:09
【问题描述】:

所以我的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 构造函数在初始化时触发查询。但在那之后,它就不会再开火了。

知道我哪里出错了吗?

【问题讨论】:

    标签: c# wpf datagrid observablecollection


    【解决方案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);
    }
    

    【讨论】:

    • 非常感谢。除此之外,原来我还忘了添加INotifyPropertyChanged 接口。
    【解决方案2】:

    查看

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

    【讨论】:

      【解决方案3】:

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

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

      我遇到了类似的问题:

      Update Observable Collection

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 2017-02-16
        • 1970-01-01
        • 2012-11-16
        相关资源
        最近更新 更多