0

私は現在、一連のデータアクセスサービスから戻ってきたドメインモデルからマッピングされた一連の複合ViewModelを備えたソリューションに取り組んでいます。

INotifyPropertyChangedこれまでのところ、ベースのViewModelオブジェクトに実装し、プロパティ変更イベントを介してプロパティオブジェクトへの変更を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、ベースビューモデルを構成するオブジェクトタイプを調べて実装することで、パフォーマンスが向上するか、あるいはこの問題を解決できるかどうかです。それとも、これは私が理解していない何か他のものから来ているのでしょうか?

4

1 に答える 1

2

コードには2つの明らかな非効率性の原因があります。

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)NotifyPropertyChangedにラムダ式を使用すると便利ですが、リフレクションを使用するためかなり時間がかかります。更新レートを上げている場合は、ラムダを文字列に置き換えます。

于 2013-03-21T17:38:32.507 に答える