如何在Avalonia v11的DataGrid中正确订阅列宽变更事件
Avalonia DataGrid列宽变更事件仅触发一次的解决办法
问题出在你代码里的订阅对象生命周期上:sub是CreateBandHeaders方法里的局部变量,方法执行完毕后,这个订阅实例就会被垃圾回收器回收,后续调整列宽时自然没有订阅者接收事件。
解决步骤如下:
- 在你的类中添加一个私有字段保存订阅对象,避免被GC回收:
private IDisposable _columnWidthSubscription;
- 修改
CreateBandHeaders方法,将订阅赋值给这个字段,同时可以简化Subscribe的写法,不用显式创建AnonymousObserver:
private void CreateBandHeaders() { var observable = _table.Columns[0].GetObservable(WidthProperty); _columnWidthSubscription = observable.Subscribe(OnNext); }
- 为了避免内存泄漏,记得在控件生命周期结束(比如卸载时)取消订阅:
protected override void OnUnloaded(RoutedEventArgs e) { base.OnUnloaded(e); _columnWidthSubscription?.Dispose(); }
如果需要监听多个列的宽度变化,可以用CompositeDisposable来统一管理所有订阅:
private CompositeDisposable _columnSubscriptions = new CompositeDisposable(); private void CreateBandHeaders() { foreach (var column in _table.Columns) { var sub = column.GetObservable(WidthProperty).Subscribe(OnColumnWidthChanged); _columnSubscriptions.Add(sub); } } protected override void OnUnloaded(RoutedEventArgs e) { base.OnUnloaded(e); _columnSubscriptions.Dispose(); } private void OnColumnWidthChanged(double newWidth) { // 处理列宽变更逻辑 }
内容的提问来源于stack exchange,提问作者No Name
相关产品推荐
相关产品推荐

