【问题标题】:ListBox, DataView, And DataTable.RejectChanges()ListBox、DataView 和 DataTable.RejectChanges()
【发布时间】:2011-05-20 09:20:30
【问题描述】:

我有一个绑定到 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"),但仍然没有运气。

有什么想法吗?

提前谢谢你。

【问题讨论】:

    标签: c# .net wpf ado.net binding


    【解决方案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 或一些数据模板)?可以发个截图吗?

    【讨论】:

    • 非常感谢!有用!我的列表框就像在我的 XAML 中一样简单。但是你为什么提到这个?如果我要使用数据模板,这个解决方案有什么问题吗?
    • 我之前只是没有将 DisplayMemberPath="Name" 与列表框一起使用,我总是使用 DataTemplate。但一切都很好:)
    • 大多数时候我也使用数据模板,但是对于这个非常简单的列表框,我认为 DisplayMemberPath 是最简单的方法:)
    猜你喜欢
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多