Есть такой DataGrid
<DataGrid Grid.Row="1" x:Name="DGStudents" Margin="10" IsReadOnly="True"
AutoGenerateColumns="False" ItemsSource="{Binding Path=studends}">
<DataGrid.Columns>
<DataGridTextColumn Header="Студент" Width="*" Binding="{Binding Path=FullName}"/>
<DataGridTextColumn Header="Группа" Width="*" Binding="{Binding Path=Group}"/>
<DataGridTextColumn Header="Курс" Width="*" Binding="{Binding Path=Course}"/>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.25*"/>
<ColumnDefinition Width="0.75*"/>
</Grid.ColumnDefinitions>
<ComboBox Grid.Column="0" ItemsSource="{Binding Path=Exams}"
DisplayMemberPath="Name" IsEnabled="True">
</ComboBox>
<Grid Grid.Column="1">
<Grid.DataContext>
<view:OrganaizerManagerVeiwModel/>
</Grid.DataContext>
<TextBlock Text="{Binding Path=Description_of_student}"/>
</Grid>
</Grid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
Классы для биндинга
internal class Student: PropertyChanging
{
public string FullName { get; set; }
public string Group { get; set; }
public int Course { get; set; }
public List<Exam> Exams { get; set; }
public Student(string fullname, string group, int course)
{
FullName = fullname;
Group = group;
Course = course;
}
}
internal class Exam
{
public string Name { get; set; }
public string Description { get; set; }
public Exam(string name, string decr)
{
Name = name;
Description = decr;
}
public override string ToString()
{
return Description;
}
}
Коллекция, которая забиндена к DataGrid
public ObservableCollection<Student> studends { get; set; }
= new ObservableCollection<Student>()
{
new Student("Ivan Petrov", "21-KB-PR2", 2)
{Exams = new List<Exam>()
{
new Exam("Math", "Perfect"),
new Exam("OOP", "Good"),
new Exam("TRPO", "Bad")
}
}
};
Вопрос. Как можно забиндить два свойства SelectedItem и Description_of_student
Сами свойства:
private Exam _selected_item;
public Exam SelectedItem
{
get => _selected_item;
set { Set(ref _selected_item, value);
MessageBox.Show(_selected_item.ToString()); }
}
private string description_of_student;
public string Descruption_of_student
{
get => description_of_student;
set => Set(ref description_of_student, value);
}
При попытке забиндить через Path у меня отображаются свойства класса Student
<Grid.DataContext>- это что такое и зачем? Если вы меняетеDataContext, то дальнейшая привязка в нем будет искаться внутри этого класса, что задан какDataContext. У вас по сути вообще не должно быть переопределения контекста в XAML, к тому же, это нарушение MVVM. +К этому всему, я вам советую подумать над названиями переменных, ибо в C# есть правила именования, которым стоит следовать (прим:Descruption_of_student->DescruptionOfStudent). Ну и последнее,Path=лишнее в привязках, достаточно просто{Binding Exams}. – EvgeniyZ Nov 18 '22 at 16:30DataContex, я в самом начале разметки объявил ко всему окну эту привязку, но мне пришлось еще раз ее использовать по второмGridтак как у меняComboBoxне видел списокExams. Такая же ситуация сTextBlock. Возможно я что-то неправильно делаю, если не мложно можете направить или дать хороший пример, который похож на мой\ – Nov 19 '22 at 13:40Examsсвязан с установкойDataContextуGrid, который инициализирует класс<view:OrganaizerManagerVeiwModel/>? Я вам даже больше скажу, если вы делаете по правилам MVVM, то это вообще не правильно. Дальше, сами свойстваDescription_of_studentиSelectedItemгде находятся? Рядом сstudendsили внутри классаStudent? Если первое, то естественно вы так не привяжетесь, ибо если выводите коллекцию, то каждый внутренний объект будет задавать свой источник данных, тут нуженFindAncestor. – EvgeniyZ Nov 19 '22 at 14:12DataContexу меня есть класс студента, как показано выше, и у него списокExamsсостоящий из классаExam. СвойстваDescription_of_studentиSelectedItemнаходятся вVM, как и сама коллекцияstudents. Задача состоит в том, чтобы Прибиндаить кDataGridколлекцию студентов, далее вDataGrid.RowDetailsTemplateобъявить отдельныйGridи в нем прибиндить имена экзаменов из классаExamкComboBox, а свойствоSelectedItemсобствеено к атрибутуComboBoxSelectedItem, чтобы я мог отследить какой экзамен выбран и вывести – Nov 19 '22 at 15:56Description_of_student, который также надо прибиндить кTextBox, для каждого экзамена. Ивзиняюсь за столь большой текст – Nov 19 '22 at 15:56DataContextу него будет автоматом объект коллекции, а не предок.<Grid.DataContext>убирайте, вам он вообще не нужен здесь, да и вообще забудьте про указание этого в XAML. Ну а{Binding Path=Description_of_student}меняете на{Binding DataContext.Description_of_student, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}. Условно говоря, мы тут ищем предка в видеDataGrid, а у него беремDataContext(наша VM), из которой и берем нужное свойство. – EvgeniyZ Nov 19 '22 at 16:06