当数据发生变化时,Gridview不会发生变化

时间:2015-01-17 17:06:18

标签: c# wpf xaml gridview data-binding

我添加了一个可观察数据并将其绑定到我的数据网格,如下所示。

private ObservableCollection<Order> _allOrders;
public ObservableCollection<Order> AllOrders
{
  get { return _allOrders;}
  set { _allOrders = value; OnPropertyChanged(); }
}

public Presenter() { _allOrders = new ObservableCollection<Order>(...); }

public event PropertyChangedEventHandler PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] String propertyName = null)
{
  PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

当我在应该过滤数据的事件上设置断点时,我将属性 AllOrder 设置为 null 。我可以使用手表验证它是否已设置。但是,视图没有更新,所以我猜我忘记了什么。当然,视图模型类 Presenter 实现 INotifyPropertyChanged 接口。

缺少什么?

修改

网格的XAML代码如下所示。

<DataGrid x:Name="dataGrid" 
          ItemsSource="{Binding AllOrders}"
          AutoGeneratingColumn="DataGrid_OnAutoGeneratingColumn" ...>

2 个答案:

答案 0 :(得分:2)

假设您相应地设置DataContext并且AllOrders绑定最初有效,如果您想要在UI中过滤项目而不进行更改收集,那么使用{{3}时会更容易} ListCollectionView。 WPF不直接绑定到集合,而是绑定到视图 - Filter

private readonly ObservableCollection<Order> _allOrders;

private readonly ListCollectionView _filteredOrders;

public ICollectionView FilteredOrders 
{ 
    get { return _filteredOrders; } 
}

public Presenter() 
{ 
    _allOrders = new ObservableCollection<Order>(...);
    _filteredOrders = new ListCollectionView(_allOrders); 
    _filteredOrders.Filter = o => ((Order)o).Active;
}

和XAML

<DataGrid ... ItemsSource="{Binding FilteredOrders}">

如果您想手动刷新用户界面,只需致电MSDN

_filteredOrders.Refresh();

除此之外,视图模型中没有任何变化。您仍然可以向_allItems添加/删除项目,并且应该由UI自动选择更改

答案 1 :(得分:0)

您是否仅在构造函数中设置属性AllOrders?如果是,则不要设置字段_allOrders,而是设置属性AllOrders。如果您设置该字段,则永远不会引发通知。