wpf - 强制 DataGrid 行刷新而不使用 INPC

标签 wpf datagrid

我有一个数据网格绑定(bind)到未实现 INotifyPropertyChanged 的项目集合(不是我可以改变的)。更改特定项目的属性后,如何强制刷新相应行中的所有绑定(bind)?

我不想使用 ObservableCollection<T>并将原始项目替换为相同类型但具有新数据的新项目,因为那样我将丢失当前选择。我可以设置 SelectedItem使用新的替换项目,但随后我将触发 SelectionChanged当我更换元素时发生的事件。

最佳答案

我想到的第一个答案是将您的集合包装到 ICollectionViewSource 中,并在收到项目更新时调用 Refresh():

public partial class MainWindow : Window
{
    public ICollectionView MyCollectionView { get; set; }

    private List<NotNotifiableObject> internalList;
    private Random _rnd;

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;

        internalList = new List<NotNotifiableObject>();
        MyCollectionView = CollectionViewSource.GetDefaultView(internalList);

        _rnd = new Random(DateTime.Now.Second);
        for (int i = 0; i < 31; i++)
        {
            internalList.Add(new NotNotifiableObject { Age = i, Name = "John Doe " + i });
        }
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var index = _rnd.Next(0, 31);
        var objectToUpdate = internalList[index];
        objectToUpdate.Name = objectToUpdate.Name + " | " + DateTime.Now;
        MyCollectionView.Refresh();
    }
}

internal class NotNotifiableObject
{
    public string Name { get; set; }
    public int Age { get; set; }
}

您只需将数据网格绑定(bind)到此 ICollectionView 属性

   <DataGrid ItemsSource="{Binding MyCollectionView}" ></DataGrid>

这工作得很好,但如果您的列表中有很多经常更新的项目,可能会影响性能

关于wpf - 强制 DataGrid 行刷新而不使用 INPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26226482/

相关文章:

wpf - 逻辑组合依赖属性

wpf - 哪种音频格式适用于Silverlight + WPF?

wpf - 如何提高 wpf 用户控制性能?

wpf - 来自 PresentationFramework.dll 的 NullReferenceException

wpf - 如何在DataGridTextColumn的工具提示中显示IDataErrorInfo的错误?

apache-flex - 动态设置dataGridColumn的ItemRenderer

wpf - 适用于我的应用程序的 Iron Python 调试器

c# - 为什么纯 IEnumerable 的内容对于 WPF DataGrid 是不可见的?

c# - 从指定列和行中的数据网格收集数据

C#:WPF MVVM 中的按钮绑定(bind)