根據上一篇 [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 屬性外,都差不多,完整範例可以參考此處。