Привязка ListView для отображения связанных с ним данных в другом ListView

#c# #wpf #xaml #data-binding

#c# #wpf #xaml #привязка данных

Вопрос:

уважаемые пользователи StackOverflow. Мне дали задание: у меня есть список студентов, который я получаю из JSON.

 [
    {
        "Name":         "Grant",
        "Groupname":    "Group1"
    },
    {
        "Name":         "Tim",
        "Groupname":    "Group2"
    },
    {
        "Name":         "Spencer",
        "Groupname":    "Group3"
    }
    .....
]
 

Тогда у меня есть два списка: первый для групп, второй для учащихся, принадлежащих к этой группе.
Проблема, которую я не могу решить: отображение учащихся текущей выбранной группы в ListBox с использованием привязки и DataContext. Итак, мне нужна помощь. Объявления Student и Group:

 public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Groupname { get; set; }
}

public class Group
{
    public string Name { get; set; }
    public int Count { get; set; } // how many students are in this group

    public List<Student> Students = new List<Student>();

    public Group()
    {
    }

    public Group(string name, int count)
    {
        this.Name = name;
        this.Count = count;
    }
}
 

В приведенном ниже коде используется список групп, и у каждой группы есть список учащихся. И на данный момент я застрял.

 public MainWindow()
{
    List<Group> groups = new List<Group>();
    
    // I excluded json deserialization and Lists initialization code...

    InitializeComponent();

    foreach (var x in groups)
    {
        GroupsView.Items.Add(x.Name);

        foreach (var y in x.Students)
        {
            StudentsView.Items.Add(y);
        }
    }
}

 

Списки в XAML

 <ListBox Name="GroupsView" HorizontalAlignment="Left" Height="172" Margin="48,0,0,0" VerticalAlignment="Center" Width="206"/>

<ListBox Name="StudentsView"  HorizontalAlignment="Left" Height="172" Margin="306,0,0,0" VerticalAlignment="Center" Width="364">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <Run Text="{Binding Path=Id}"></Run>
                <Run Text="{Binding Path=Name}"></Run>
            </TextBlock>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
 

Я знаю, что это как-то связано с XAML, но у меня внезапно возникла эта проблема, и мне нужно быстро ее решить. И в последний раз я использовал C # в 2017 году, поэтому, пожалуйста, извините за мой глупый вопрос. Если кто-нибудь может помочь, я был бы очень благодарен

Комментарии:

1. Привет и добро пожаловать. В MainWindow(), foreach, вы добавляете всех учащихся из всех групп в представлении списка учащихся. возможно, вы захотите закрыть эту часть. Может быть, просто добавьте учеников первой группы. Вам необходимо реализовать . Метод SelectedValueChanged для списка GroupsView. В методе очистите текущий список учащихся и заполните StudentsView учащимися из выбранной группы.

2. Привет! Спасибо за ваш ответ! Прошу прощения, я не могу поддержать ваше предложение

3. Нет проблем. Я не написал полностью закодированный ответ, так что все в порядке.

Ответ №1:

  1. Во-первых, вам необходимо реализовать INotifyPropertyChanged для MainWindow, поэтому у вас будет OnPropertyChanged();
 public class MainWindow : INotifyPropertyChanged
 

Смотрите здесь, https://docs.microsoft.com/en-us/dotnet/desktop/wpf/data/how-to-implement-property-change-notification?view=netframeworkdesktop-4.8

И в конструкторе добавьте: this.DataContext = this;

  1. Затем добавьте следующие свойства:
 private List<Group> _groups;

public List<Group> Groups
{
    get { return _groups; }
    set { _groups = value; OnPropertyChanged(); }
}

private Group _selectedGroup;


public Group SelectedGroup
{
    get { return _selectedGroup; }
    set 
    { 
        _selectedGroup = value; 
        OnPropertyChanged();
        if (_selectedGroup != null)
        {
            Students = _selectedGroup.Students;
        }
    }
}

private List<Student> _students;

public List<Student> Students
{
    get { return _students; }
    set { _students = value; OnPropertyChanged(); }
}
 
  1. Привязка данных:
 <ListBox ItemsSource=”{Binding Groups}” SelectedItem=”{Binding SelectedGroup}” … />
<ListBox ItemsSource=”{Binding Students}” … />
 

Комментарии:

1. Фрэнк, большое спасибо! Я собираюсь попробовать! Я был так потерян, теперь я понял направление