我有一个数据网格绑定(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/