3

我对 WPF 比较陌生,想知道是否有人可以帮助我。

我有一个收藏视图,其中包含一个可观察的集合列表,用于存储我的所有项目。我的数据网格的项目源是集合视图。我在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 列表.

我目前的工作是……每当一个城市发生变化时,我都会清除并重新填充我的 observablecollectionlist 以供小组更新……必须有更好的方法!

我的问题是,有什么方法可以在我更新/编辑项目时手动/动态更新数据网格组?

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

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

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

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

4

2 回答 2

0

好的....当我更新我的项目时,我找不到更新分组的直接方法。但是我找到了一个解决方法。我实现了一个事件,每当我在文本框中、事件内部更改文本时都会触发一个事件,在经过一些验证后,我调用 collectionview 上的 refresh() 方法和分组更新。

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

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

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

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

当文本框失去焦点设置编辑标志为假时,检查以确保当前文本与以前的文本不同。

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

于 2013-10-10T05:39:17.007 回答
0

我遇到了同样的问题。让它与 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;
}
  }

 // ...

}
于 2014-01-08T14:26:50.330 回答