You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Avalonia v11的DataGrid中正确订阅列宽变更事件

Avalonia DataGrid列宽变更事件仅触发一次的解决办法

问题出在你代码里的订阅对象生命周期上:sub是CreateBandHeaders方法里的局部变量,方法执行完毕后,这个订阅实例就会被垃圾回收器回收,后续调整列宽时自然没有订阅者接收事件。

解决步骤如下:

  1. 在你的类中添加一个私有字段保存订阅对象,避免被GC回收:
private IDisposable _columnWidthSubscription;
  1. 修改CreateBandHeaders方法,将订阅赋值给这个字段,同时可以简化Subscribe的写法,不用显式创建AnonymousObserver:
private void CreateBandHeaders()
{
    var observable = _table.Columns[0].GetObservable(WidthProperty);
    _columnWidthSubscription = observable.Subscribe(OnNext);
}
  1. 为了避免内存泄漏,记得在控件生命周期结束(比如卸载时)取消订阅:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 09:52:27