项目编辑/更新后的WPF Datagrid更新分组
我是WPF的新手,不知道是否有人能帮我 我有一个collectionview,它保存一个可观察的收集列表,其中存储了我的所有项目。我的datagrid的项源是集合视图。我在datagrid XAML中有一个简单的分组项目编辑/更新后的WPF Datagrid更新分组,wpf,datagrid,grouping,updating,collectionview,Wpf,Datagrid,Grouping,Updating,Collectionview,我是WPF的新手,不知道是否有人能帮我 我有一个collectionview,它保存一个可观察的收集列表,其中存储了我的所有项目。我的datagrid的项源是集合视图。我在datagrid XAML中有一个简单的分组 <DataGrid.GroupStyle> <GroupStyle> <GroupStyle.HeaderTemplate>
<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,则只要文本框处于焦点,文本更改事件中不会处理任何内容。但是,一旦文本框失去焦点,您可以检查更改或执行任何操作。