[LiveCharts2] 使用 EntityIndex 產生 Coordinate

根據上一篇 [LiveCharts2] ChartEntityMetaData 的敘述來改善之前 [LiveCharts2] 資料對應 -- IChartEntity interface 中的寫法。

原本在  [LiveCharts2] 資料對應 -- IChartEntity interface 這一篇中我強迫讓 PersonViewModel 多了一個 Index 屬性處理,這一篇要應用 ChartEntityMetaData.EntityIndex 屬性改善硬幹的部分。

PersonViewModel 會改成以下的寫法:

  public class PersonViewModel : NotifyPropertyBase, IChartEntity
 {

     public PersonViewModel()
     {
         MetaData = new ChartEntityMetaData(OnEntityIndexChanged) { EntityIndex = -1 };
     }

     private void OnEntityIndexChanged(int index)
        {
            ChangeCoordinate(index);
        }

     private void ChangeCoordinate(int index)
        {
            Coordinate = new Coordinate(index, Score);
        }

     protected override void OnPropertyChanged(string propertyName)
        {
            if (propertyName == nameof(Score) && MetaData.EntityIndex > -1)
            {
                Coordinate = new Coordinate(MetaData.EntityIndex, Score);
            }
            base.OnPropertyChanged(propertyName);
        }

     private string _name;
     public string Name
        {
            get => _name;
            set => SetProperty(ref _name, value);
        }

     private int _score;
     public int Score
        {
            get => _score;
            set => SetProperty(ref _score, value);
        }

    
     public ChartEntityMetaData MetaData
        {
            get; set;
        }
     public Coordinate Coordinate
        {
            get; set;
        }
 }

首先在建構式中要指派執行個體給 MetaData 屬性 :

 public PersonViewModel()
 {
     MetaData = new ChartEntityMetaData(OnEntityIndexChanged) { EntityIndex = -1 };
 }

 private void OnEntityIndexChanged(int index)
 {
     ChangeCoordinate(index);
 }

EntityIndex 屬性值在初始時務必設定為 -1,因為當 EntityIndex 改變時會呼叫 OnEntityIndexChanged(int index) 方法,如果 EntityIndex 的初始值是 0 的話,那序列的第一筆資料就無法產生 Coordinate。

第二個重點是覆寫來自於基底類別 NotifyPropertyBase 的 OnPropertyChanged 方法,這個目的是因為如果長條圖建立完後,Score 如果有改變必須要取得新的 Coordinate 讓長條圖會變化。為了驗證這個效果,畫面上有多加一個按鈕去修改魯夫的 Score。

 protected override void OnPropertyChanged(string propertyName)
 {
     if (propertyName == nameof(Score) && MetaData.EntityIndex > -1)
     {
         Coordinate = new Coordinate(MetaData.EntityIndex, Score);
     }
     base.OnPropertyChanged(propertyName);
 }

其他的部分,除開拿掉了硬幹上去的 Index 屬性外,都差不多,完整範例可以參考此處