Обновление диаграммы LiveCharts после выбора элемента из таблицы (WPF + MVVM)
Можно ли сделать так, чтобы диаграмма(LiveCharts) реагировала на событие SelectedItem, которое принадлежит ListView.
XML Разметка
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" DockPanel.Dock="Bottom">
<Button Margin="10 0 10 5" Width="100" Content="Export" Command="{Binding ExportFile}"></Button>
</StackPanel>
<ListView Margin="10" ItemsSource="{Binding Users}" SelectedItem="{Binding SelectedUser}">
<ListView.View>
<GridView>
<GridViewColumn Header="Full Name" Width="Auto" DisplayMemberBinding="{Binding Path=User}" />
<GridViewColumn Header="Average" Width="Auto" DisplayMemberBinding="{Binding Path=Average}"/>
<GridViewColumn Header="Max" Width="Auto" DisplayMemberBinding="{Binding Path= Max}"/>
<GridViewColumn Header="Min" Width="Auto" DisplayMemberBinding="{Binding Path= Min}"/>
</GridView>
</ListView.View>
</ListView>
<lvc:CartesianChart LegendLocation="Bottom">
<lvc:CartesianChart.Series>
<lvc:LineSeries Values="{Binding Values}"></lvc:LineSeries>
</lvc:CartesianChart.Series>
<lvc:CartesianChart.AxisY>
<lvc:Axis Title="Steps" LabelFormatter="{Binding YFormatter}"></lvc:Axis>
</lvc:CartesianChart.AxisY>
<lvc:CartesianChart.AxisX>
<lvc:Axis Title="Day" Labels="{Binding XFormatter}"></lvc:Axis>
</lvc:CartesianChart.AxisX>
</lvc:CartesianChart>
Свойство которое привязывается
private UserStats selectedUser;
public UserStats SelectedUser
{
get => selectedUser;
set
{
selectedUser = value;
OnPropertyChanged("SelectedUser");
}
}
Класс UserStats
public class UserStats : INotifyPropertyChanged
{
private string user;
private int min;
private int max;
private double average;
private int isMoreAverage;
public ObservableCollection<UserModel> Users;
public string User
{
get => user;
set
{
user = value;
OnPropertyChanged("User");
}
}
public int Min
{
get => min;
set
{
min = value;
OnPropertyChanged("Min");
}
}
public int Max
{
get => max;
set
{
max = value;
OnPropertyChanged("Max");
}
}
public double Average
{
get => average;
set
{
average = value;
OnPropertyChanged("Avaverage");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string prop = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
}
}
Диаграмма должна строится по значениям из списка public ObservableCollection<UserModel> Users;
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Вам не нужен SelectedItem, ну если только вы не используете это где-то в ViewModel
Можно вот так
<ListView Margin="10" ItemsSource="{Binding Users}" IsSynchronizedWithCurrentItem="True">
И привязка
<lvc:CartesianChart Series="{Binding Users/Users}" LegendLocation="Bottom">
Потом, Users должно быть свойством { get; set; }, а у вас поле. Еще было бы неплохо по аналогии с остальными данными реализовать INPC для Users
private ObservableCollection<UserModel> users;
public ObservableCollection<UserModel> Users
{
get => users;
set
{
users = value;
OnPropertyChanged(); // [CallerMemberName] позволяет не указывать здесь аргумент
}
}
Код не тестировал, могут быть ошибки, пишите в комментарии, если будут еще вопросы