我相对较新,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,看看这是否能满足我的需要
非常感谢任何帮助,谢谢!
答案 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;
}
}
// ...
}