项目编辑/更新后的WPF Datagrid更新分组

时间:2013-10-09 06:22:33

标签: wpf datagrid grouping updating collectionview

我相对较新,WPF想知道是否有人可以帮助我。

我有一个collectionview,它包含一个observablecollection列表,用于存储我的所有项目。我的datagrid的项目源是集合视图。我在datagrid XAML中有简单的分组......

            <DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Name}" FontWeight="Bold" Padding="3"/>
                        </StackPanel>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
        </DataGrid.GroupStyle>

现在......添加/删除项目工作正常,但每当我更新/编辑项目时,组都不会更新。比方说,例如,项目按城市分组,如果我在一个城市名称“西雅图”下有3个项目,则将其中一个城市名称更改为“布鲁克林”,“布鲁克林”城市保留在西雅图组之下,直到我重新填充可观察的收集清单。

我当前的工作......就是每当一个城市被改变时,我就会清理并重新填充我的observablecollectionlist,让团队更新......必须有一个更好的方法!

我的问题是,有没有办法在我更新/编辑项目时手动/动态更新数据网格组?

注意 INotifyPropertyChanged我90%肯定不是这里的问题,我已尝试使用此界面进行各种组合,每当我编辑/更新项目时,组都不会更新。但是,每当我添加一个项目(如果它是一个新城市)时,将创建一个新组,如果我删除了一个城市中的所有项目,那么该城市组也将被删除。此外,它不仅仅是特定的项目,还有任何项目列。

编辑好的,仍然没有解决方案......但我找到了另一种解决方法,这再一次不是最优雅的。我为城市框设置了一个事件处理程序..所以每当城市被更改时,都会调用事件处理程序,并刷新集合视图。但是每当我添加一个项目时都会调用该事件,当我点击该项目时调用该项目,并且每当我进行更改时都会调用两次,因此它并不是每个有效的...仍在寻找想法。

EDIT2 我现在正在研究IEditableObject的BeginEdit和EndEdit,看看这是否能满足我的需要

非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

好吧....我更新我的项目后找不到更新分组的直接方法。但是我找到了一个解决方法..我实现了一个事件,只要我在文本框中更改文本,在事件内部以及经过一些验证后我就调用了集合视图上的refresh()方法和分组更新。

这个解决方案我有点畏缩,因为调用refresh会调用每个正在刷新的文本框的文本框更改事件,只是对该事件的许多不必要的调用在该事件中经过我的验证。所以我拥有的文本框越多,每当我刷新视图以进行简单的文本框更改时,事件就会被调用的次数越多。

如果其他人有任何解决方案或想法,请告诉我,因为我现在必须坚持使用此解决方案:(

编辑伪代码解决方案,如果有人好奇......

当文本框获得焦点时,将编辑标志设置为true,因此在编辑期间文本框上不会发生任何事务。

当文本框失去焦点集编辑标志为false时,请检查以确保当前文本与前一个文本不同。

如果当前文本框中的当前文本不同        刷新collectionview对象

答案 1 :(得分:0)

我遇到了同样的问题。得到它使用ObservableCollectionImplementation,它通过一个单独的Eventhandler(Look here)产生项目更改。所以在ViewModel中我只是在eventhandler中订阅ItemPropertyChanges并强制刷新所有内容。

也许这对某人有帮助。

问候!

public class MyViewModel: ViewModelBase
{
  ObservableCollectionEx<IEditableItem> _rawsource;
  ICollectionView _viewSource;

  public MyViewModel (ObservableCollectionEx rawDataSource)
  {
    this._rawsource = rawDataSource;
    this._rawsource.ItemPropertyChanged += new PropertyChangedEventHandler(RawSource_ItemPropertyChanged);

    // Create the CollectionView
    this._viewSource = new ListCollectionView(this._rawsource);
  }

  void RawSource_ItemPropertyChanged(object sender, PropertyChangedEventArgs e)
  {
    // Check if this is a Collection of EditableObjects - so a CommitEdit can be fired
if (this._viewSource is IEditableCollectionView)
    {
      var so = this._viewSource as IEditableCollectionView;
      so.CommitEdit();
    }

// CollectionView refresh
this._viewSource.Refresh();
  }

  // Here is our Bindable object
  public ICollectionView ItemSourcer
  {
get
{
  return this._viewSource;
}
  }

 // ...

}