ListBox、DataView 和 DataTable。RejectChanges()

3

我有一个绑定到DataView的列表框。

<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个回答

1
当我使用DataTables时,我总是使用BindingListCollectionView进行绑定,因为WPF会隐式地执行这个操作。但现在我可以使用Refresh()方法来刷新我的UI绑定。
public BindingListCollectionView Categories {get; private set;}

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

//after reject
this.Categories.Refresh()

不过,你的ListBox长什么样子(只有你发布的XAML还是包括一些数据模板)?你能发一张截图吗?


非常感谢!它起作用了!我的列表框与我的XAML一样简单。但是你为什么要提到这个?如果我使用数据模板,这个解决方案有问题吗? - Dummy01
我以前从未在列表框中使用过 DisplayMemberPath="Name",我总是使用 DataTemplate。但现在一切都好了 :) - blindmeis
大多数情况下,我也使用数据模板,但对于这个非常简单的列表框,我认为DisplayMemberPath是最简单的方法 :) - Dummy01

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