使用INotifyPropertyChanged的复合模型绑定性能

本文关键字:绑定 性能 模型 复合 INotifyPropertyChanged 使用 | 更新日期: 2023-09-27 18:05:14

我目前正在研究一种解决方案,该解决方案具有一组复合ViewModels,这些ViewModels是从一组数据访问服务返回的域模型映射而来的。

到目前为止,我已经成功地在基本ViewModel对象上实现了INotifyPropertyChanged,并通过属性更改事件通知UI属性对象的更改。

下面是一个视图模型的例子:

public class DisplayDataModel : INotifyPropertyChanged{ 
   private DateTime _lastRefreshTime;
    public DateTime LastRefreshTime {
        get { return _lastRefreshTime; }
        set {
            _lastRefreshTime = value;
            this.NotifyPropertyChanged(lddm => lddm.LastRefreshTime, PropertyChanged);
        }
    }
    private string _lineStatus;
    public string LineStatus {
        get { return _lineStatus; }
        set {
            if (_lineStatus != value) {
                _lineStatus = value;
                this.NotifyPropertyChanged(lddm => lddm.LineStatus, PropertyChanged);
            }
        }
    }           
    private ProductionBrickModel _productionBrick;
    public ProductionBrickModel ProductionBrick { 
        get { return _productionBrick;}
        set {
            if (_productionBrick != value) {
                _productionBrick = value;
                this.NotifyPropertyChanged(lddm => lddm.ProductionBrick, PropertyChanged);
            }
        }
    }
}
public class ProductionBrickModel{
    public int? Set { get; set; }
    public int? Theoretical { get; set; }
    public int? Actual { get; set; }
    public string LineName { get; set; }
    public TimeSpan? ShiftOverage { get; set; }
    public SolidColorBrush ShiftOverageBrush {
        get {
            if (ShiftOverage.HasValue && ShiftOverage.Value.Milliseconds < 0) {
                return Application.Current.FindResource("IndicatorRedBrush") as SolidColorBrush;
            }
            return Application.Current.FindResource("IndicatorWhiteBrush") as SolidColorBrush;
        }
    }
    public string ShiftOverageString { get { return ShiftOverage.HasValue ? ShiftOverage.Value.ToShortTimeSpanString() : ""; } }
}

所以目前我在基本模型上触发通知事件,而不是生产砖属性,主要是因为生产砖属性几乎每次刷新都会改变。

最近我开始将刷新时间降低到350ms左右,我看到ShiftOverageBrush在一瞬间变成白色的情况,即使值仍然是负的。

我的问题是通过在构成基本视图模型的对象类型上执行INotifyPropertyChanged,我会获得任何性能,甚至可能解决这个问题吗?还是说这完全是我不理解的其他原因?

使用INotifyPropertyChanged的复合模型绑定性能

您的代码中有两个明显的低效率来源:

1) ShiftOverageBrush每次调用时都使用FindResource。为什么不缓存画笔呢?

private SolidColorBrush _redBrush;
private SolidColorBrush IndicatorRedBrush
{
    get{ return _redBrush ?? (_redBrush = 
        Application.Current.FindResource("IndicatorRedBrush") as SolidColorBrush)); 
}
... same for white brush
public SolidColorBrush ShiftOverageBrush {
    get {
        if (ShiftOverage.HasValue && ShiftOverage.Value.Milliseconds < 0) {
            return IndicatorRedBrush;
        }
        return IndicatorWhiteBrush;
    }
}

2)使用lambda表达式NotifyPropertyChanged是方便的,但相当慢,因为它使用反射。如果要提高更新速率,则将lambdas替换为字符串。