2011-05-20 32 views
3

我有一个绑定到DataView的列表框。ListBox,DataView和DataTable.RejectChanges()

<ListBox ItemsSource="{Binding Path=Categories}" DisplayMemberPath="Name"></ListBox> 

其中Categories是类的属性继承的INotifyPropertyChanged接口:

public class EditCategoriesPresenter : INotifyPropertyChanged 
{ 
    private DataTable _TableOfCategories; 

    public DataView Categories { get { return _TableOfCategories.DefaultView; } } 

    ... 
} 

虽然对基础DataTable(行插入和删除,列值的变化)的所有数据的更改会反映到列表框自动,当我做DataTable.RejectChanges()行更改反映,但不列值更改。

我可以理解为什么会发生这种情况(DataTable.RejectChanges没有提出任何列值更改通知),但仍找不到任何简单的解决方案来解决它。

我也在DataTable.RejectChanges()之后加OnPropertyChanged("Categories"),但还是没有运气。

任何想法?

预先感谢您。

回答

1

当我使用数据表时,我总是使用BindingListCollectionView进行绑定,导致wpf无论如何都会隐式执行此操作。但现在我可以使用Refresh()方法来刷新我的UI绑定。

public BindingListCollectionView Categories {get; private set;} 

this.Categories = (BindingListCollectionView)CollectionViewSource.GetDefaultView(this._TableOfCategories); 

//after reject 
this.Categories.Refresh() 

然而,你的ListBox看起来像什么(只是你发布的xaml或者一些数据类型)?你可以张贴截图吗?

+0

非常感谢!有用!我的列表框非常简单,就像在我的XAML中一样。但你为什么提到这个?如果我将使用数据模板,这个解决方案有什么问题吗? – Dummy01 2011-05-20 10:05:16

+0

我刚刚没有使用DisplayMemberPath =“名称”与列表框之前,我总是使用DataTemplate。但它都好:) – blindmeis 2011-05-20 10:33:02

+0

大部分时间我也使用数据模板,但对于这个列表框这非常简单,我认为DisplayMemberPath是最简单的方法:) – Dummy01 2011-05-20 10:49:36