【问题标题】:Gridview doesn't change when data changes数据更改时Gridview不会更改
【发布时间】:2015-01-17 17:06:17
【问题描述】:

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

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" ...>

【问题讨论】:

  • ObservableCollection 不需要 PropertyChanged*。该集合已经对绑定进行了所有通知。请显示您的 XAML(的相关部分)
  • @DrKoch 我使用by this blogger 跟随模式。也许这不是最佳方法。至于 XAML,在这种情况下哪个部分是相关的?我已经添加了我认为的内容。请查看编辑。
  • @KonradViltersten 我是否理解正确,最初您可以看到一些项目(绑定工作)但在某些时候您将 AllOrders 设置为 null 并且项目不会消失?是的,如果您稍后设置该属性,则需要 AllOrders 中的 PropertyChangedObservableCollection 仅涵盖收集中的项目发生的情况。
  • @dkozl 你理解正确。而且由于我要来回过滤,我实际上更喜欢只显示属性 Active 更改为某物的项目,而不是分配整个属性 AllOrders i> 全部结束。
  • 请向我们展示您将AllOrders 设置为null 的代码。给你带来问题的地方。

标签: c# wpf xaml gridview data-binding


【解决方案1】:

假设您相应地设置了DataContext 并且AllOrders 绑定最初可以工作,如果您想过滤UI 中的项目,而不需要更改集合,那么将ListCollectionViewFilter 一起使用会容易得多。 WPF 不直接绑定到集合,而是绑定到视图 - MSDN

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}">

当您想手动刷新 UI 时,只需调用 Refresh

_filteredOrders.Refresh();

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

【讨论】:

  • 太棒了。 +½ 表示灵活的替代建议,+½ 表示回复中包含链接的漂亮代码示例。
【解决方案2】:

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

【讨论】:

  • 我在构造函数中设置私有 _allOrders 。然后,在选中复选框时,我将分配给公共Allorders 。那么应该发出通知。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多