数据改变时Gridview不会改变
Gridview doesn't change when data changes
我添加了一个可观察数据并将其绑定到我的数据网格,如下所示。
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.我可以使用手表验证它是否设置为该设置。但是,视图没有更新,所以我猜我忘记了什么。当然,视图模型 class Presenter 实现了 INotifyPropertyChanged 接口。
缺少什么?
编辑
网格的 XAML 代码如下所示。
<DataGrid x:Name="dataGrid"
ItemsSource="{Binding AllOrders}"
AutoGeneratingColumn="DataGrid_OnAutoGeneratingColumn" ...>
你只在构造函数中设置属性 AllOrders
吗?如果是这样,则不要设置字段 _allOrders
而是设置 属性 AllOrders
。如果您设置该字段,则永远不会发出通知。
假设您相应地设置了 DataContext
,并且如果您想过滤 UI 中的项目,AllOrders
绑定最初起作用,而无需更改集合,那么当您使用 ListCollectionView
with a Filter
. WPF does not bind directly to collection but to a view - 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();
除此之外,视图模型没有任何变化。您仍有 add/remove 项到 _allItems
,更改应由 UI
自动获取
我添加了一个可观察数据并将其绑定到我的数据网格,如下所示。
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.我可以使用手表验证它是否设置为该设置。但是,视图没有更新,所以我猜我忘记了什么。当然,视图模型 class Presenter 实现了 INotifyPropertyChanged 接口。
缺少什么?
编辑
网格的 XAML 代码如下所示。
<DataGrid x:Name="dataGrid"
ItemsSource="{Binding AllOrders}"
AutoGeneratingColumn="DataGrid_OnAutoGeneratingColumn" ...>
你只在构造函数中设置属性 AllOrders
吗?如果是这样,则不要设置字段 _allOrders
而是设置 属性 AllOrders
。如果您设置该字段,则永远不会发出通知。
假设您相应地设置了 DataContext
,并且如果您想过滤 UI 中的项目,AllOrders
绑定最初起作用,而无需更改集合,那么当您使用 ListCollectionView
with a Filter
. WPF does not bind directly to collection but to a view - 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();
除此之外,视图模型没有任何变化。您仍有 add/remove 项到 _allItems
,更改应由 UI