WPF数据表格:在编辑/更新项后更新分组

3

我在使用WPF方面相对比较新,想知道是否有人可以帮助我。

我有一个CollectionView,它持有一个ObservableCollection列表以储存我的所有项目。我的DataGrid的ItemsSource是这个CollectionView。在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。但是,每当我添加一个项目时就会调用该事件,当我单击该项目时也会调用该事件,并且在进行更改时每次都会调用两次,因此效率不高...仍在寻找想法。
非常感谢您的帮助,谢谢!
2个回答

1

我遇到了同样的问题。通过使用ObservableCollectionImplementation解决了这个问题,它通过一个单独的事件处理程序(请看这里)产生项目更改。因此,在ViewModel中,我只需订阅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;
}
  }

 // ...

}

0

好的,我找不到直接更新分组的方法,但是我找到了一个解决方法。我实现了一个事件,每当我更改文本框中的文本时,该事件就会被触发,在事件中进行一些验证后,我调用集合视图上的refresh()方法,然后分组就会更新。

这个解决方案让我有点不爽,因为调用refresh将为每个被刷新的文本框调用文本框更改事件,这是许多不必要的调用,而且在该事件中还要经过我的验证。所以我拥有的文本框越多,每当我为简单的文本框更改刷新视图时,事件就会被调用更多次。

如果其他人有任何解决方案或想法,请告诉我,因为我现在只能坚持这个解决方案 :(

编辑 如果有人感兴趣,这是伪代码解决方案...

当文本框获得焦点时,将编辑标志设置为true,因此在编辑期间不能对文本框进行任何事务。

当文本框失去焦点时,将编辑标志设置为false,并检查当前文本是否与先前文本不同。

如果当前文本与当前文本框中的文本不同,则刷新集合视图对象。


你介意发布你的代码解决方案吗?我在想,通过将事件属性Handled设置为true,您是否能够消除对TextChanged事件的级联调用。 - ouflak
我认为你需要在文本框的“GotFocus”事件中设置一个标志。我不确定这是否是正确的事件。但是,如果标志为真,则只要文本框处于焦点状态,就不会在文本更改事件中处理任何内容。然而,一旦文本框失去焦点,你就可以检查更改或进行其他操作。 - Ben Cheng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接