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

项目编辑/更新后的WPF Datagrid更新分组,wpf,datagrid,grouping,updating,collectionview,Wpf,Datagrid,Grouping,Updating,Collectionview,我是WPF的新手,不知道是否有人能帮我 我有一个collectionview,它保存一个可观察的收集列表,其中存储了我的所有项目。我的datagrid的项源是集合视图。我在datagrid XAML中有一个简单的分组 <DataGrid.GroupStyle> <GroupStyle> <GroupStyle.HeaderTemplate>

我是WPF的新手,不知道是否有人能帮我

我有一个collectionview,它保存一个可观察的收集列表,其中存储了我的所有项目。我的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个项目,则将其中一个城市名称更改为“布鲁克林”。在我重新填充observablecollection列表之前,“布鲁克林”城市仍在西雅图组下

我目前的工作是。。。每当一个城市发生变化时,我都会清除并重新填充我的可观察的集合列表,以供团体更新。。。一定有更好的办法

我的问题是,是否有任何方法可以在我更新/编辑项目时手动/动态地更新datagrid组

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

编辑确定,仍然没有解决方案。。。但我找到了另一件作品,它又一次不是最优雅的。我为城市框放置了一个事件处理程序。。因此,无论何时更改城市,都会调用事件处理程序,我会刷新collectionview。但是,每当我添加一个项目时,就会调用该事件;当我单击该项目时,就会调用该事件;每当我进行更改时,就会调用该事件两次,因此它不是很有效。。仍在寻找创意

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


非常感谢您的帮助,谢谢

好吧。。。。在更新项目时,我找不到直接更新分组的方法。但是我找到了一份工作。。我实现了一个事件,每当我在文本框内、事件内更改文本时都会触发该事件,经过一些验证后,我调用collectionview上的refresh()方法并对分组进行更新

这个解决方案让我有些畏缩,因为调用refresh将为每个正在刷新的textbox调用textbox changed事件,只是对该事件的大量不必要的调用,这些调用将在该事件中通过我的验证。因此,我拥有的文本框越多,每当我刷新视图以进行简单的文本框更改时,调用事件的次数就越多

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

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

当textbox获得焦点时,将编辑标志设置为true,以便在编辑过程中不会在textbox上发生任何事务

当textbox失去焦点时,将编辑标志设置为false,请检查以确保当前文本与以前的文本不同

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

我遇到了同样的问题。让它使用ObservableCollectionImplementation,它通过一个单独的Eventhandler(外观)生成项目更改。因此在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;
}
  }

 // ...

}
公共类MyViewModel:ViewModelBase { ObservableCollectionEx_rawsource; ICollectionView viewSource; 公共MyViewModel(ObservableCollectionEx rawDataSource) { 这是.\u rawsource=rawDataSource; 此._rawsource.ItemPropertyChanged+=新的PropertyChangedEventHandler(rawsource\u ItemPropertyChanged); //创建CollectionView this.\u viewSource=newlistcollectionview(this.\u rawsource); } void RawSource\u ItemPropertyChanged(对象发送方,PropertyChangedEventArgs e) { //检查这是否是EditableObjects的集合-以便可以激发CommittedIt 如果(此._viewSource为IEditableCollectionView) { var so=此._viewSource作为IEditableCollectionView; 所以,承诺它(); } //CollectionView刷新 这是._viewSource.Refresh(); } //这是我们的可绑定对象 公共ICollectionView项目源 { 得到 { 返回此。\u viewSource; } } // ... }
您是否介意发布您的代码解决方案。我想知道您是否可以通过将事件属性Handled设置为true来消除对TextChanged事件的级联调用。我想您需要在文本框“GotFocus”中设置一个标志事件我不确定这是否是正确的事件。但是,如果标志为true,则只要文本框处于焦点,文本更改事件中不会处理任何内容。但是,一旦文本框失去焦点,您可以检查更改或执行任何操作。