当绑定数据发生更改时,Gridview不会更新

时间:2015-01-17 19:17:10

标签: c# wpf xaml data-binding datagrid

我已将数据网格和一堆复选框绑定到视图模型中的以下属性(键入 Presenter )。

public ListCollectionView AllOrdersView { get; set; }

public IEnumerable<CarrierType> AllCarrierTypes
{
  get { return _allCarrierTypes; }
  set
  {
    _allCarrierTypes = value;
    OnPropertyChanged();
  }
}

在它的构造函数中,我指定了一个类似的过滤器。

public Presenter()
{
  _allOrders = new ObservableCollection<Order>(DataAccessor.GetOrders());
  AllOrdersView = new ListCollectionView(_allOrders);
  AllOrdersView.Filter = element => AllCarrierTypes
    .Where(x => x.Active).Contains(((Order)element).CarrierType);
}

目的是过滤掉具有未选中类型的承运人的订单。目前,似乎最初只在调用构造函数时才进行过滤。我的希望是,由于复选框已绑定,我不需要进一步干预代码。事实并非如此。在选中/取消选中复选框时,数据网格不受影响。

此外,怀疑它与刷新视图的需要有关,我添加了对视图的调用,如下所示。

private void ToggleButton_OnUnchecked(Object sender, RoutedEventArgs eventArgs)
{
  ((Presenter)DataContext).AllOrdersView.Refresh();
}

可悲的是,这似乎没有任何区别,我被困住了。所以,我的问题是这些。

  1. 我是否需要在事件处理程序中明确刷新?
  2. 我是否需要添加另一种(种类)绑定?
  3. 我是否需要在视图模型中实现更多功能?
  4. 我的绑定以下列方式完成。

    <ListBox ItemsSource="{Binding AllCarrierTypes}">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <CheckBox Content="{Binding Name}"
                    IsChecked="{Binding Active,Mode=TwoWay}"
                    Checked="ToggleButton_OnChecked"
                    Unchecked="ToggleButton_OnUnchecked"/>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
    
    <DataGrid x:Name="dataGrid" 
              ItemsSource="{Binding AllOrdersView}"
              AutoGeneratingColumn="DataGrid_OnAutoGeneratingColumn" .../>
    

    修改

    每个请求 - 模型中 CarrierType 类的完整版本。

    public class CarrierType : INotifyPropertyChanged
    {
      private bool _active;
    
      public int Id { get; set; }
      public String Name { get; set; }
      public bool Active
      {
        get { return _active; }
        set
        {
          _active = value;
          OnPropertyChanged();
        }
      }
    
      public override String ToString()
      {
        return Name;
      }
    
      public event PropertyChangedEventHandler PropertyChanged;
    
      [NotifyPropertyChangedInvocator]
      protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
      {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
      }
    }
    

1 个答案:

答案 0 :(得分:1)

.NET 4.5中的 ListCollectionView 似乎存在问题(不确定之前是否存在问题)。您需要调用 Refresh(),但它似乎不起作用。

我所做的是重新分配过滤器。

private void ToggleButton_OnUnchecked(Object sender, RoutedEventArgs eventArgs)
{
  AllOrdersView.Filter = element => AllCarrierTypes
    .Where(x => x.Active).Contains(((Order)element).CarrierType); 
}

根据以下评论的要求:

  <CheckBox IsChecked="{Binding Active,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>