根据上一篇 [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 属性外,都差不多,完整范例可以参考此处