#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:
- Во-первых, вам необходимо реализовать 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;
- Затем добавьте следующие свойства:
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(); }
}
- Привязка данных:
<ListBox ItemsSource=”{Binding Groups}” SelectedItem=”{Binding SelectedGroup}” … />
<ListBox ItemsSource=”{Binding Students}” … />
Комментарии:
1. Фрэнк, большое спасибо! Я собираюсь попробовать! Я был так потерян, теперь я понял направление